2014-04-15 2 views
0

java를 사용하여 유닉스 셸 특수 변수에 액세스하는 방법. 유닉스java를 사용하여 유닉스 셸 특수 변수에 액세스하는 방법

몇 가지 예는 특별한 변수 쉘 :

현재 쉘의 프로세스 ID (PID)를 출력

echo $$.

echo $0 현재 실행중인 명령의 이름이 인쇄됩니다.

echo $? 10 진수 문자열로 실행 된 마지막 명령의 종료 상태를 인쇄합니다.

이러한 셸 변수가 스크립트 파일에 포함되어 있고 스크립트 파일을 ProcessBuilder 인수로 전달한 경우 java를 사용하여 성공적으로 실행할 수 있습니다. 그러나 이러한 변수가 인수로 전달되면 변수 자체로 취급되지 않습니다. 왜? 이 특수 쉘 변수에 액세스하는 방법은 무엇입니까?

echo $$ 
echo $? 
echo $0 

스크립트를 실행 파일에 쉘 특수 변수 시험이 자바 클래스 : 주석 아래 라인 :

String command ="/home/csk/sptest.sh"; 

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.ArrayList; 
import java.util.List; 

public class ExecSpecVars { 

    public static void main(String a[]){ 

     InputStream is = null; 
     ByteArrayOutputStream baos = null; 

     List<String> list = new ArrayList<String>(); 
    // String command ="/home/csk/sptest.sh"; 
     String command ="echo $$"; //This should print the PID instead of the string "$$". 

     String cmd[] = command.split(" "); 

     for (int i = 0; i < cmd.length; i++) { 
      list.add(cmd[i]); 
     } 

     ProcessBuilder pb = new ProcessBuilder(list); 
     try { 
      Process prs = pb.start(); 
      is = prs.getInputStream(); 
      byte[] b = new byte[1024]; 
      int size = 0; 
      baos = new ByteArrayOutputStream(); 
      while((size = is.read(b)) != -1){ 
       baos.write(b, 0, size); 
      } 
      System.out.println(new String(baos.toByteArray())); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally{ 
      try { 
       if(is != null) is.close(); 
       if(baos != null) baos.close(); 
      } catch (Exception ex){} 
     } 
    } 
} 

sptest.sh 파일은 아래의 명령이 포함되어 있습니다

아래의 내용에 대한 설명 :

String command ="echo $$"; 

답변

1

echo 명령이 $$이 아니라 bash을 해결하지 못하기 때문입니다.

Java는 bash 쉘에서 명령을 실행하지 않으므로 작동하지 않습니다.

명령을bash에 실행하면 효과가 있지만 기대했던 결과를 반환하지 않습니다. 그것은 자바 프로세스보다는 bash에 대한 정보를 반환합니다 : 당신은 지금 다른 명령 ('/ 빈/bash는')과 주어진 정보를 실행하고 있기 때문에

/bin/bash -c 'echo $$' -> pid of bash process 
/bin/bash -c 'echo $?' -> bash exit code 
/bin/bash -c 'echo $0' -> /bin/bash 

이 그 명령이 아닌 당신의 JVM에 대해입니다.

요약하면 Java에서 원하는 것을 쉽게 수행 할 수있는 방법은 없습니다. 여기

이 (코드는 상당히 정돈과 구아바를 사용하여) 증명하기 위해 빠른 테스트 케이스의 :

public static void main(final String[] args) throws Exception { 
    System.out.println(ManagementFactory.getRuntimeMXBean().getName()); 
    runCommand("/bin/bash", "-c", "echo $$"); 
    runCommand("/bin/bash", "-c", "echo $?"); 
    runCommand("/bin/bash", "-c", "echo $0"); 
} 

private static void runCommand(String... command) throws IOException { 
    ProcessBuilder pb = new ProcessBuilder(command); 
    Process prs = pb.start(); 
    try (InputStream is = prs.getInputStream()) { 
     byte[] b = ByteStreams.toByteArray(is); 
     System.out.println(new String(b, StandardCharsets.UTF_8)); 
    } 
} 

출력 :

[email protected] 
4467 

0 

/bin/bash 

그래서 당신은 pid는 JVM 이상의 높은 것을 알 수있다 pid. 프로그램 이름은 '/ bin/bash'입니다.