Bash-Kindprozess-Ausgabe in Variable schreiben

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Ulidor
Beiträge: 557
Registriert: 19.12.2004 21:54:40
Wohnort: Bielefeld

Bash-Kindprozess-Ausgabe in Variable schreiben

Beitrag von Ulidor » 04.04.2010 22:16:32

Hallo,

wie kann ich in einem Bash-Skript die Ausgabe eines Hintergrudprozesses in eine Variable schreiben?

Das folgende Skript ergibt natürlich keinen Sinn, ist nur ein Test:

Code: Alles auswählen

#!/bin/sh

echo vor
ckbu=`cksum /tmp2/debian-500-i386-netinst.iso | cut -d " " -f 1,2` &
echo nach
wait
echo '"'$ckbu'"'
Die Variable ckbu wird nicht gesetzt. Die Zeile geht (vermutlich) komplett in den Hintergrund, so dass das aufrufende Skript nicht drauf zugreifen kann.

Ich könnte die Ausgabe in eine Datei z.B. in /dev/shm/ schreiben und vom Skript einer Variablen zuweisen, aber das wäre ja nun nicht gerade elegant.

Gibt es eine andere Lösung?
Was erhält man, wenn man einen Windows-PC abschaltet? – Ausgemachten Blödsinn.

fbartels
Beiträge: 326
Registriert: 20.08.2009 10:06:56
Kontaktdaten:

Re: Bash-Kindprozess-Ausgabe in Variable schreiben

Beitrag von fbartels » 05.04.2010 08:38:10

Hi,

ohne es jetzt ausprobiert zu haben sieht das doch ganz gut aus, lediglich die & sollte innerhalb der single quotes sein.

Gruß

Benutzeravatar
Ulidor
Beiträge: 557
Registriert: 19.12.2004 21:54:40
Wohnort: Bielefeld

Re: Bash-Kindprozess-Ausgabe in Variable schreiben

Beitrag von Ulidor » 05.04.2010 11:58:05

fbartels hat geschrieben: ohne es jetzt ausprobiert zu haben sieht das doch ganz gut aus, lediglich die & sollte innerhalb der single quotes sein.
Hi fbartels,

hatte ich auch vermutet, deshalb hab ich es ausprobiert. Das "&" hat dann offenbar keine Wirkung.
Was erhält man, wenn man einen Windows-PC abschaltet? – Ausgemachten Blödsinn.

coresploit
Beiträge: 237
Registriert: 26.04.2009 01:57:27
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Nettetal
Kontaktdaten:

Re: Bash-Kindprozess-Ausgabe in Variable schreiben

Beitrag von coresploit » 05.04.2010 13:15:10

lass das & mal ganz weg und probier es mal mit $( ).

Benutzeravatar
Ulidor
Beiträge: 557
Registriert: 19.12.2004 21:54:40
Wohnort: Bielefeld

Re: Bash-Kindprozess-Ausgabe in Variable schreiben

Beitrag von Ulidor » 05.04.2010 13:50:41

vwochnik hat geschrieben:lass das & mal ganz weg und probier es mal mit $( ).
Mit $( ) hatte ich es schon probiert, geht leider auch nicht.

Mir geht es vor allem darum, cksum in den Hintergrund zu bekommen, weil das bei großen Dateien/Partitionen sehr zeitintensiv ist. Das geht doch eigentlich nur mit "&"(?)

Ich hab auch mal das versucht:

Code: Alles auswählen

#!/bin/sh

echo vor
ckbu=`nohup cksum /tmp2/debian-500-i386-netinst.iso | cut -d " " -f 1,2`
echo nach
wait
echo '"'$ckbu'"'
aber dann kommt:

Code: Alles auswählen

$ ./tes3
vor
nohup: ignoriere Eingabe und leite Standardfehlerausgabe auf Standardausgabe um
nach
"2818880780 157204480"
und cksum läuft dann auch nicht im Hintergrund.

Ich hab auch schon mal das "&" vor die Pipe geschrieben, mal mit mal ohne Leerzeichen dazwischen, aber das mag die Bash gar nicht.
Wenn ich den ganzen cksum-Befehl einschließlich "&" in runde Klammern setze, hat "&" wieder keine Wirkung (oder die Pipe wartet vielleicht, bis cksum beendet ist).
Was erhält man, wenn man einen Windows-PC abschaltet? – Ausgemachten Blödsinn.

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: Bash-Kindprozess-Ausgabe in Variable schreiben

Beitrag von gms » 05.04.2010 15:48:53

Ulidor hat geschrieben:

Code: Alles auswählen

...
ckbu=`cksum /tmp2/debian-500-i386-netinst.iso | cut -d " " -f 1,2` &
...
echo '"'$ckbu'"'
Die Variable ckbu wird nicht gesetzt. Die Zeile geht (vermutlich) komplett in den Hintergrund, so dass das aufrufende Skript nicht drauf zugreifen kann.
stimmt, die Variable wird sicherlich schön brav in der Subshell gesetzt, das aufrufende Skript bekommt davon natürlich nichts mit
fbartels hat geschrieben: ohne es jetzt ausprobiert zu haben sieht das doch ganz gut aus, lediglich die & sollte innerhalb der single quotes sein
wenn das & innerhalb der Quotes ist, dann muß die aufrufende Shell trotzdem warten, bis der Hintergrundprozeß terminiert ist, erst dann kann die Variable 'ckbu' gesetzt werden
Ulidor hat geschrieben: Ich könnte die Ausgabe in eine Datei z.B. in /dev/shm/ schreiben und vom Skript einer Variablen zuweisen, aber das wäre ja nun nicht gerade elegant.
so eine Lösung ist aber nicht unüblich ( egal, ob dafür eine Datei oder Named Pipe oder sonstiges verwendet wird ) und ich finde sie auch nicht so unelegant

mittels 'coproc' kann man ähnliches erzielen, wird dadurch aber auch nicht sehr viel eleganter:

Code: Alles auswählen

gms@gms1 ~ $ coproc { date; read ;}
[1] 11662
gms@gms1 ~ $ read -u ${COPROC[0]} D
gms@gms1 ~ $ echo $D
Mon Apr 5 15:37:12 CEST 2010
gms@gms1 ~ $
gms@gms1 ~ $ kill $COPROC_PID
[1]+  Beendet                 coproc COPROC { date; read; }
Gruß
gms

Benutzeravatar
Ulidor
Beiträge: 557
Registriert: 19.12.2004 21:54:40
Wohnort: Bielefeld

Re: Bash-Kindprozess-Ausgabe in Variable schreiben

Beitrag von Ulidor » 05.04.2010 16:02:17

gms hat geschrieben:
Ulidor hat geschrieben: Ich könnte die Ausgabe in eine Datei z.B. in /dev/shm/ schreiben und vom Skript einer Variablen zuweisen, aber das wäre ja nun nicht gerade elegant.
so eine Lösung ist aber nicht unüblich ( egal, ob dafür eine Datei oder Named Pipe oder sonstiges verwendet wird ) und ich finde sie auch nicht so unelegant
Tja, ich befürchte, so werde ich es wohl machen müssen. :(

coproc kannte ich noch gar nicht. Aber stimmt, es sieht auch nicht gerade elegant aus. :wink: Trotzdem danke für den Tipp.
Was erhält man, wenn man einen Windows-PC abschaltet? – Ausgemachten Blödsinn.

Benutzeravatar
mistersixt
Beiträge: 6601
Registriert: 24.09.2003 14:33:25
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Bash-Kindprozess-Ausgabe in Variable schreiben

Beitrag von mistersixt » 06.04.2010 09:25:06

Es hat zwar nichts direkt mit Deinem Problem zu tun, aber bei der Überschrift kam mir gleich die Variable $! in den Sinn, mit der man ff. machen kann :

Code: Alles auswählen

#!/bin/bash

export HOURS=12

/pfad/zu/einem/programm > /tmp/bla.log 2>&1 &

job=$!
sleep `expr $HOURS '*' 3600`
kill $job
Sprich, in $job steht die PID des geforkten Prozesses, der dann nach 12 Stunden Laufzeit gekillt wird. Wie gesagt, hat nicht direkt mit Deiner Sache zu tun, passt aber halt zum Thema "Bash-Kindprozess-Ausgabe in Variable schreiben".

Gruss, mistersixt.
--
System: Debian Bookworm, 6.11.x.-x-amd64, ext4, AMD Ryzen 7 3700X, 8 x 3.8 Ghz., Radeon RX 5700 XT, 32 GB Ram, XFCE

Antworten