Heim > Backend-Entwicklung > Golang > So führen Sie Vordergrund- oder Hintergrund-Shell-Befehle in Go aus

So führen Sie Vordergrund- oder Hintergrund-Shell-Befehle in Go aus

WBOY
Freigeben: 2024-02-08 22:57:31
nach vorne
1165 Leute haben es durchsucht

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

php-Editor Apple stellt Ihnen vor, wie Sie Front- oder Hintergrund-Shell-Befehle in Go ausführen. In der Go-Sprache ist das Ausführen von Shell-Befehlen sehr einfach. Mithilfe des Pakets os/exec können wir problemlos verschiedene Shell-Befehle ausführen und deren Ausgabe erhalten. Unabhängig davon, ob Vordergrundbefehle oder Hintergrundbefehle ausgeführt werden, bietet die Go-Sprache entsprechende Methoden. In diesem Artikel lernen wir, wie man Front- oder Hintergrund-Shell-Befehle mit der Go-Sprache ausführt, und untersuchen einige häufige Anwendungsfälle. Lasst uns beginnen!

Frageninhalt

In go muss ich in der Lage sein, Shell-Befehle vom Benutzer auszuführen und nur Befehle zu blockieren, die im Vordergrund ausgeführt werden (nicht mit & ausgeführt werden), während ich die Ausgabe des Befehls abrufe.

Zum Beispiel können wir in Bash:

#!/bin/bash
while read -p 'enter a command: ' cmd; do
    /bin/sh -c "$cmd" >(sed 's/^/line of output: /')
done
Nach dem Login kopieren

Benutzer können etwas wie sleep 5这样的前台命令; echo hi 会阻塞并且提示不会立即重新出现,或者他们可以输入后台命令,如 { sleep 5;回声嗨; & eingeben und es wird nicht blockiert und die Eingabeaufforderung wird sofort wieder angezeigt, während der Befehl im Hintergrund ausgeführt wird.

Wie kann ich es in Go neu erstellen? Hier ist mein Versuch:

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)
        }
    }
}
Nach dem Login kopieren

Ausführen sleep 5; echo hi 会阻塞并且可以工作,但是 { sleep 5;回声嗨; } & Fehler:

panic: read |0: file already closed
Nach dem Login kopieren

Für den Kontext habe ich die Sprachsteuerung so portiert, dass der Benutzer sie konfigurieren kann runtype 等操作,其中他们的命令通过 shell 运行,并模拟按键以键入输出。用户可以使用后台命令,以便语音控制与命令一起继续,例如,他们可以在说出“菜单”时启动菜单,并且在打开时仍然能够使用语音控制: menu: runtype printf %s\n 这个那个 | dmenu &.

Problemumgehung

Setzen Sie stdout auf eine benannte Pipe, um dieses Verhalten zu erreichen.

Das obige ist der detaillierte Inhalt vonSo führen Sie Vordergrund- oder Hintergrund-Shell-Befehle in Go aus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage