2017-05-14 6 views
2

Linux OS의 경우 "realpath ~/bin"을 실행하면 올바른 경로 "/ home/user1/bin"이 제공됩니다. 나는 다음과 같은 설정을 실행할 때bash 명령을 직접 실행할 때와 exec.Command를 수행 할 때의 결과가 다릅니다

는하지만 :

cmd := exec.Command("realpath", "~/bin") 
var out bytes.Buffer 
cmd.Stdout = &out 
err := cmd.Run() 
if err != nil { 
    panic(err) 
} 
fmt.Println("Realapth:", out.String()) 

나는 panic: exit status 1을 얻었다.

BTW : 다음과 같이 명령 :

cmd := exec.Command("realpath", "--help") 

내가 realpath 명령에 대한 올바른 도움말 메시지를 얻을 수 있습니다. 나는 그것이 실제로 실행 경로에 있다는 것을 의미한다고 생각합니다.

+0

이 경우'Go '는'~'를 사용자의 홈 디렉토리로 확장하지 않습니다. http://stackoverflow.com/a/17617721/3781709 –

답변

1

셸 (예 : bash)에서 명령을 실행하는 경우 으로 전달되기 전에 tilde-prefix이 셸에 의해 확장됩니다.

이동 응용 프로그램에서 실행할 경우 틸드는 그대로두고 realpath은 경로 이름의 일부로 간주합니다. 차이를 확인하려면, 당신은 쉘에서 다음 명령 (리눅스 OS)를 시도 할 수 있습니다 :

//1. correctly expanded 
realpath './bin' 

//2. tilde not expanded 
realpath '~/bin' 

//3. tilde expansion 
realpath ~/bin 

(2) 실패해야하는, 그리고 이동 응용 프로그램의 상황이 비슷합니다. 다음과 같이 확인하려면 이동 코드를 변경 :

cmd := exec.Command("realpath", "~/bin") 
var out bytes.Buffer 
var serr bytes.Buffer 
cmd.Stdout = &out 
cmd.Stderr = &serr 
err := cmd.Run() 
if err != nil { 
    fmt.Printf("Error = %v, %v\n", err, serr.String()) 
    panic(err) 
} 
fmt.Println("Realapth:", out.String()) 

당신은 realpath 명령에 의해 생성 된 오류 메시지를 관찰 할 수 있어야한다.