2017-05-14 2 views
2

Auf Linux OS, führen Sie "realpath ~/bin" gibt den richtigen Pfad "/ home/user1/bin".Unterschiedliches Ergebnis zwischen Befehl run bash direkt und über exec.Command

Aber wenn ich es als Gebrüll laufen:

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()) 

Ich habe panic: exit status 1.

BTW: mit Befehl wie folgt:

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

Ich kann für realpath Befehl richtige Hilfemeldung. Ich denke, das bedeutet, dass es wirklich in meinem ausführbaren Pfad ist.

+0

'Go' wird in diesem Fall nicht' ~ 'in das Home-Verzeichnis des Benutzers expandieren. http://Stackoverflow.com/a/17617721/3781709 –

Antwort

1

Wenn Sie den Befehl in einer Shell (z. B. Bash) ausführen, wird eine tilde-prefix von der Shell vor der Übergabe an realpath erweitert.

Wenn Sie es jedoch in einer Go-Anwendung ausführen, wird Tilde so belassen, wie es ist, und realpath nimmt es als Teil des Pfadnamens an. Um den Unterschied zu sehen, können Sie den folgenden Befehl in Shell (Linux O) versuchen:

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

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

//3. tilde expansion 
realpath ~/bin 

Die (2) soll nicht, und die Situation in Ihrer Go-Anwendung ist ähnlich. Um zu überprüfen, ändern Sie Ihren Go-Code wie folgt:

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()) 

sollten Sie in der Lage sein, Fehlermeldung von realpath Befehl erzeugt zu beobachten.

Verwandte Themen