首頁 > 後端開發 > Golang > 如何在 Go 中執行前台或後台 shell 指令

如何在 Go 中執行前台或後台 shell 指令

WBOY
發布: 2024-02-08 22:57:31
轉載
1166 人瀏覽過

如何在 Go 中运行前台或后台 shell 命令

php小編蘋果為您介紹如何在Go中執行前台或後台shell指令。在Go語言中,執行shell指令非常簡單。透過使用os/exec包,我們可以輕鬆地執行各種shell命令,並取得其輸出。無論是執行前台命令還是後台命令,Go語言都提供了相應的方法。在本文中,我們將學習如何使用Go語言來執行前台或後台shell指令,並探討一些常見的用例。讓我們開始吧!

問題內容

在go 中,我需要能夠從使用者執行shell 命令,並且僅阻止在前台運行的命令(不使用& 運行),同時檢索命令的輸出。

例如,在 bash 中我們可以:

#!/bin/bash
while read -p 'enter a command: ' cmd; do
    /bin/sh -c "$cmd" >(sed 's/^/line of output: /')
done
登入後複製

使用者可以輸入類似sleep 5這樣的前台命令; echo hi 會阻塞並且提示不會立即重新出現,或者他們可以輸入後台命令,如{ sleep 5;迴聲嗨; & 並且它不會阻塞,並且當命令在背景運行時,提示符會立即重新出現。

我如何在 go 中重新建立它?這是我的嘗試:

package main

import (
    "bufio"
    "os"
    "os/exec"
)

func main() {
    input := bufio.newscanner(os.stdin)
    for {
        print("enter a command: ")
        input.scan()
        cmd := exec.command("/bin/sh", "-c", input.text())
        stdout, err := cmd.stdoutpipe()
        if err != nil {
            panic(err)
        }
        go func() {
            output := bufio.newscanner(stdout)
            for output.scan() {
                println("line of output: " + output.text())
            }
            if output.err() != nil {
                panic(output.err())
            }
        }()
        if err := cmd.start(); err != nil {
            panic(err)
        }
        if err := cmd.wait(); err != nil {
            panic(err)
        }
    }
}
登入後複製

運行 sleep 5; echo hi 會阻塞並且可以工作,但是 { sleep 5;迴聲嗨; } & 錯誤:

panic: read |0: file already closed
登入後複製

對於上下文,我將語音控制移植到 go,用戶可以在其中配置 runtype 等操作,其中他們的命令通過 shell 運行,並模擬按鍵以鍵入輸出。使用者可以使用後台命令,以便語音控制與命令一起繼續,例如,他們可以在說出「選單」時啟動選單,並且在開啟時仍然能夠使用語音控制: menu: runtype printf %s\\n這個那個| dmenu &

解決方法

將 stdout 設定為命名管道即可實現該行為。

以上是如何在 Go 中執行前台或後台 shell 指令的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板