/ / Nohup innerhalb einer Schleife eines Bash-Skripts verwenden - bash, shell, loops, unix, nohup

Nohup innerhalb einer Schleife eines Bash-Skripts verwenden - bash, shell, loops, unix, nohup

Ich habe ein Bash-Skript, das eine Schleife über eine Liste von Unterverzeichnissen enthält. In der Schleife I cd Führen Sie in jedem Unterverzeichnis einen Befehl mit nohup und dann cd wieder raus. Im folgenden Beispiel habe ich die ausführbare Datei durch eine ersetzt echo Befehl zur Vereinfachung.

#!/bin/bash
dList=("dname1" "dname2" "dname3")
for d in $dList; do
cd $d
nohup echo $d &
cd ..
done

Das obige bewirkt, dass Nohup während der ersten Schleife mit folgender Ausgabe hängen bleibt:

$ ./script.sh
./dname1
$ nohup: appending output to `nohup.out"

Das Skript wird nicht durch die Schleife fortgesetzt. Um die Befehlszeile erneut eingeben zu können, muss die Eingabetaste gedrückt werden. OK, das ist normal nohup Verhalten, wenn man es auf der Shell verwendet, aber offensichtlich funktioniert es nicht für mein Skript. Wie kann ich bekommen nohup einfach ausführen und dann dem Skript erlauben, fortzufahren?

Ich habe bereits (erfolglos) Variationen des nohup-Befehls einschließlich versucht

nohup echo $d < /dev/null &

aber das hat nicht geholfen. Außerdem habe ich versucht, einschließlich

trap "" HUP

am Anfang des Skripts, aber das half auch nicht. Bitte helfen Sie!

EDIT: Da @anubhava richtig darauf hingewiesen hat, enthielt meine Schleife einen Fehler, der dazu führte, dass das Skript nur den ersten Eintrag im Array verwendete. Hier ist die korrigierte Version.

#!/bin/bash
dList=("dname1" "dname2" "dname3")
for d in ${dList[@]}; do
cd $d
nohup echo $d &
cd ..
done

Jetzt erreicht das Skript, was ich wollte. Allerdings bekommen wir immer noch die nervige Ausgabe von nohup, die Teil meiner ursprünglichen Frage war.

Antworten:

5 für die Antwort № 1

Das Problem ist hier:

for d in $dList; do

Das wird nur laufen for Schleife einmal für das erste Element des Arrays.

Um über ein Array zu iterieren, benutzen Sie:

for d in ${dList[@]}; do

Voll funktionsfähiges Skript:

dList=("dname1" "dname2" "dname3")
for d in "${dList[@]}"; do
cd "$d"
{ nohup echo "$d" & cd -; } 2>/dev/null
done