1
我的Go應用程序輸出一定數量的文本數據,我需要將其傳送到某個外部命令(例如less
)。我沒有找到任何方法將這些數據傳送到syscall.Exec
'ed過程。管道執行過程
作爲一種變通方法我是文本數據寫入到一個臨時文件,然後使用該文件作爲參數傳遞給less
:
package main
import (
"io/ioutil"
"log"
"os"
"os/exec"
"syscall"
)
func main() {
content := []byte("temporary file's content")
tmpfile, err := ioutil.TempFile("", "example")
if err != nil {
log.Fatal(err)
}
defer os.Remove(tmpfile.Name()) // Never going to happen!
if _, err := tmpfile.Write(content); err != nil {
log.Fatal(err)
}
if err := tmpfile.Close(); err != nil {
log.Fatal(err)
}
binary, err := exec.LookPath("less")
if err != nil {
log.Fatal(err)
}
args := []string{"less", tmpfile.Name()}
if err := syscall.Exec(binary, args, os.Environ()); err != nil {
log.Fatal(err)
}
}
它的工作原理,但留下一個文件系統上的臨時文件,因爲syscall.Exec
替換當前與另一個(less
)一個進程和延遲os.Remove
將不會運行。這種行爲是不可取的。
有什麼辦法可以將某些數據傳輸到外部進程而不會留下任何僞像?
謝謝,我知道'os/exec' * et al *,但它不會解決我的問題。我想將數據通過管道傳輸到類似頁面的環境('less'),而不是使用一些文本工具處理它並處理輸出。 –
@PetrShevtsov:我誤解了,因爲你不能直接管道到你要執行的過程。管道阻塞並且數據必須在某處緩衝。每個人都說這不是一個Go問題,因爲你不能一般這樣做。如果你在一個posix系統上(我用syscall.Exec和'less'調用假設),你可以刪除tmp文件。 – JimB
謝謝,它的作品!但我可以擺脫臨時文件,並直接寫入'syscall.Stdin'? –