Ich möchte wissen, ob es eine Möglichkeit gibt, das kaufmännische Und in eine Variable einzufügen und dennoch einen Prozess in den Hintergrund zu senden.
Das funktioniert:
BCKGRND=yes
if [ "$BCKGRND" = "yes" ]; then
sleep 5 &
else
sleep 5
fi
Aber wäre es nicht cool, diese fünf Zeilen mit nur einer zu erreichen? Wie so:
BCKGRND='&'
sleep 5 ${BCKGRND}
Das geht aber nicht Wenn BCKGRND nicht gesetzt ist, funktioniert es - aber wenn es gesetzt ist, wird es als wörtliches '&' interpretiert und es treten Fehler auf.
bash
shell-script
variable
background-process
BrowncoatOkie
quelle
quelle
echo $!
Antworten:
Es ist nicht möglich, eine Variable als Hintergrund für den Aufruf zu verwenden, da die Variablenerweiterung erfolgt, nachdem die Befehlszeile für Steuerungsoperatoren (wie
&&
und&
) analysiert wurde .Eine weitere Option wäre, die Aufrufe in eine Funktion zu packen:
... und stellen Sie dann die Variable nach Bedarf ein:
quelle
ed
? +1 sowieso, das ist die sauberste Lösung.Sie können Dinge umdrehen und den „Vordergrund“ variieren:
Stellen Sie
FOREGROUND
auftrue
oder leeren Sie den Prozess im Hintergrund laufen zu lassen. (Die EinstellungFOREGROUND
,true
im Hintergrund ausgeführt zu werden, ist zugegebenermaßen verwirrend! Geeignete Variablennamen werden dem Leser als Übung überlassen.)quelle
set -m
es nicht verwendet wurde).Sie müssten wahrscheinlich verwenden
eval
:eval
bewirkt, dass die Shell die angegebenen Argumente neu bewertet. Ein Literal&
würde daher als&
am Ende eines Befehls und nicht als Argument für den Befehl interpretiert , wodurch der Befehl in den Hintergrund gestellt wird.quelle
eval
sollte eine Warnung enthalten, dass dies mit Vorsicht behandelt werden sollte. Siehe zB diese Antwort ."$BCKGRND"
man ein leeres Argument bewertet.eval
wird seine Argumente mit Leerzeichen verbinden, bevor die eigentliche Bewertung durchgeführt wird. Probieren Sie es einfach aus :eval printf "'{%s}\n'" foo "" "" ""
.eval foo "" "" "" ""
ist völlig ähnlicheval foo
, egal wasIFS
oder was anderes ist.eval 'sleep $TIMEOUT' "$BACKGROUND"
. Andernfalls können Sie doppelte Erweiterungen erhalten, wenn die Variable zu einer anderen Variablen erweitert wird oder Sonderzeichen enthält. Auch verschachtelte Zitate können schwierig werden.