Bash-Befehlsersetzung ($ (...)) erzwingt den Prozess in den Vordergrund

8

Zusammenfassung: Ich habe ein Bash-Skript, das einen Prozess im Hintergrund ausführt und als normaler Befehl innerhalb eines Befehlssubstitutionsblocks wie $(...) arbeiten soll. Das Skript selbst erzeugt einen Prozess, der zum Hintergrund führt. Es kann auf diesen Testfall reduziert werden:

%Vor%

Wird dieses Skript in einer Shell ausgeführt, kehrt es sofort zurück (und gibt "something" aus). Wenn es innerhalb von $(...) ausgeführt wird, bleibt es 5 Sekunden lang stehen und wartet darauf, dass der Hintergrund beendet wird.

Gilt für alles, was in der Befehlssubstitutionsshell gestartet wird und Prozesse im Hintergrund erzeugt, einschließlich aller untergeordneten Elemente in dieser Prozessstruktur. Scheint sowohl bash als auch zsh zu beeinflussen, habe andere nicht ausprobiert.

Ursprüngliche Frage: Ich habe ein Bash-Skript, das einen Wert nach stdout drucken soll und es jedes Mal in die X-Zwischenablage kopieren soll, wenn es ausgeführt wird.

%Vor%

Dieses Skript (nennen wir es "etwas") soll verwendet werden, um dieses Wort zu erhalten (was eigentlich die Ausgabe eines anderen Befehls ist) und kann auf verschiedene Arten verwendet werden, wie zum Beispiel:

%Vor%

Druckt auf normales Standardformat, kopiert die Ausgabe in die Zwischenablage, um in normalen X-Anwendungen verwendet zu werden, und sollte auch in der Lage sein, stdout mit bash-Befehlsersatz zu verwenden, um dieses Wort in die Mitte eines Befehls einzufügen.

Die Basssyntax scheint jedoch xclip im Vordergrund zu halten. xclip normalisiert sich normalerweise selbst, da die X-Zwischenablage erfordert, dass ein Client den Inhalt der Zwischenablage bereitstellt, und das Standardverhalten ist, dass er beendet wird, sobald der Inhalt der Zwischenablage ersetzt wurde.

Nachdem ich dieses Problem mit xclip hatte, habe ich den minimalen Testfall gemacht, den ich am Anfang dieser Frage geschrieben habe, so scheint es zu gelten, dass alles, was sich in der $(...) shell befindet,

gilt

Kann jemand dieses Verhalten erklären? Kann ich es irgendwie vermeiden?

    
dequis 01.06.2013, 15:04
quelle

1 Antwort

12

Wenn der Hintergrundprozeß die Befehlssubstitution nicht stören soll, müssen Sie seine Standardausgabe abbrechen. Dies wird sofort zurückkehren:

%Vor%

Sie werden die Fähigkeit verlieren, die Hintergrundausgabe des Hintergrundprozesses zu erfassen, aber wenn Sie sie im Hintergrund ausführen, ist Ihnen das wahrscheinlich egal. Der Prozess bg.sh kann immer auf die Festplatte schreiben.

    
glenn jackman 01.06.2013, 17:03
quelle