


Führen Sie dynamische Bash-Skripte mit Go aus, einschließlich einer einzeiligen Funktionsdeklaration
Ich schreibe einen Bash-Task-Runner in Go und er hat ein einfaches Konzept:
- Es lautet
taskfile
, ein Bash-Skript, das eine Aufgabendefinition (eine einfache Bash-Funktionsdeklaration) enthält - Es fügt dynamisch zusätzliche Inhalte hinzu
- Führen Sie den Befehl gemäß den übergebenen Parametern aus
Hier ist ein vereinfachtes Beispiel:
package main import ( "fmt" "os/exec" ) func main() { //simplified for a dynamically built script taskfilecontent := "#!/bin/bash\n\ntask:foo (){\n echo \"test\"\n}\n" // simplified for passed arguments task := "\ntask:foo" bash, _ := exec.lookpath("bash") cmd := exec.command(bash, "-c", "\"$(cat << eof\n"+taskfilecontent+task+"\neof\n)\"") fmt.println(cmd.string()) out, _ := cmd.combinedoutput() fmt.println(string(out)) }
Mein Problem ist jetzt, dass es bei der Ausführung über go nicht funktioniert und ich diese Fehlermeldung erhalte
task:foo: no such file or directory
Aber wenn ich das generierte Skript direkt in der Shell ausführe, funktioniert es:
$ /opt/opt/homebrew/bin/bash -c "$(cat << EOF #!/bin/bash task:foo (){ echo "test" } task:foo EOF )" test <-- printed out from the `task:foo` above
Was mache ich hier falsch?
Richtige Antwort
Zuallererst: Hier ergibt nichts einen Sinn.
Du bekommst nichts, was du nicht bekommst:
cmd := exec.command(bash, "-c", taskfilecontent+"\n"+task)
Wenn Sie es weglassen, wird Ihr Code einfacher.
Zweitens: Erklären Sie den Grund
Wenn Sie im Shell laufen:
65be85239 Bett 5...die Dinge rund um $()
的 "
s sind nicht die Syntax der Bash-Kopie, die gestartet wird, sondern die Syntax der Bash-Kopie, die den Befehl analysiert. /em>. Sie teilen der Bash-Kopie mit, dass das Ergebnis der Befehlsersetzung als String übergeben wird, unbeeinflusst von String-Splitting oder Platzhaltern.
Ebenso ein einziges Argument zu $(cat <<eof
、eof
和最终的 )"
也是交互式 shell 的指令,而不是它调用的非交互式 shell。它是运行的交互式 shell cat
(包含连接到其标准输入的heredoc内容的临时文件),读取 cat
副本的标准输出,然后将该数据替换为传递给 bash -c
.
In Ihrem Go-Programm haben Sie keine interaktive Shell, daher sollten Sie die Go-Syntax (nicht die Shell-Syntax) verwenden, um alle diese Schritte auszuführen. Was diese Schritte betrifft, gibt es keinen Grund, zum ersten Speicherort zu gehen (keine Notwendigkeit, die Datendatei in eine temporäre Datei zu schreiben, keine Notwendigkeit, den Inhalt dieser Datei gelesen zu haben, keine Notwendigkeit, einen Unterprozess zur Ausführung zu verwenden Befehlsersetzung, um eine Zeichenfolge zu generieren (die dann in die Befehlszeile der endgültigen Shell eingefügt wird), daher wäre es klüger, alle diese Schritte zu ignorieren. /bin/cat
Das obige ist der detaillierte Inhalt vonFühren Sie dynamische Bash-Skripte mit Go aus, einschließlich einer einzeiligen Funktionsdeklaration. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Dieser Artikel erläutert die Paketimportmechanismen von Go: benannte Importe (z. B. importieren & quot; fmt & quot;) und leere Importe (z. B. Import _ & quot; fmt & quot;). Benannte Importe machen Paketinhalte zugänglich, während leere Importe nur T ausführen

In diesem Artikel werden die Newflash () -Funktion von BeEGO für die Übertragung zwischen PAGE in Webanwendungen erläutert. Es konzentriert sich auf die Verwendung von Newflash (), um temporäre Nachrichten (Erfolg, Fehler, Warnung) zwischen den Controllern anzuzeigen und den Sitzungsmechanismus zu nutzen. Limita

Dieser Artikel beschreibt die effiziente Konvertierung von MySQL -Abfrageergebnissen in GO -Strukturscheiben. Es wird unter Verwendung der SCAN -Methode von Datenbank/SQL zur optimalen Leistung hervorgehoben, wobei die manuelle Parsen vermieden wird. Best Practices für die Struktur -Feldzuordnung mithilfe von DB -Tags und Robus

Dieser Artikel zeigt, dass Mocks und Stubs in GO für Unit -Tests erstellen. Es betont die Verwendung von Schnittstellen, liefert Beispiele für Mock -Implementierungen und diskutiert Best Practices wie die Fokussierung von Mocks und die Verwendung von Assertion -Bibliotheken. Die Articl

In diesem Artikel werden die benutzerdefinierten Typ -Einschränkungen von GO für Generika untersucht. Es wird beschrieben, wie Schnittstellen die minimalen Typanforderungen für generische Funktionen definieren und die Sicherheitstypsicherheit und die Wiederverwendbarkeit von Code verbessern. Der Artikel erörtert auch Einschränkungen und Best Practices

Dieser Artikel beschreibt effizientes Dateischreiben in Go und vergleicht OS.WriteFile (geeignet für kleine Dateien) mit OS.openfile und gepufferter Schreibvorgänge (optimal für große Dateien). Es betont eine robuste Fehlerbehandlung, die Verwendung von Aufschub und Überprüfung auf bestimmte Fehler.

In dem Artikel werden Schreiben von Unit -Tests in GO erörtert, die Best Practices, Spottechniken und Tools für ein effizientes Testmanagement abdecken.

In diesem Artikel wird die Verwendung von Tracing -Tools zur Analyse von GO -Anwendungsausführungsfluss untersucht. Es werden manuelle und automatische Instrumentierungstechniken, den Vergleich von Tools wie Jaeger, Zipkin und Opentelemetrie erörtert und die effektive Datenvisualisierung hervorheben
