(sed's/^/lineofoutput:/')doneDer Benutzer kann so etwas eingeben wie Sleep5 Ein solcher Vordergrundbefehl wird blockiert und die Eingabeaufforderung wird nicht sofort wieder angezeigt, oder sie können einen Hintergrundbefehl wie eingeben"/> (sed's/^/lineofoutput:/')doneDer Benutzer kann so etwas eingeben wie Sleep5 Ein solcher Vordergrundbefehl wird blockiert und die Eingabeaufforderung wird nicht sofort wieder angezeigt, oder sie können einen Hintergrundbefehl wie eingeben">

Heim  >  Artikel  >  Backend-Entwicklung  >  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
WBOYnach vorne
2024-02-08 22:57:311089Durchsuche

如何在 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

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

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

panic: read |0: file already closed

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen