Ich verwende bash
als meine Haupt-Shell, aber es ist eine offene Frage und Antwort für Muscheln, die nicht bash
sehr willkommen sind.
Wenn ich interaktiv tippe
#original line
#wget http://something.com && unzip something && mv -f something /home/poney/
#new line
wget http://something.com ; unzip something ; mv -f something /home/poney/
Macht es einen Unterschied in Bezug auf Ausführungsstapel, Reihenfolge, Speicher, Interpretation und Berechtigung im Vergleich zu einem Skript, das diese Zeile enthält:
#!/bin/bash
wget http://something.com
unzip something
mv -f something /home/poney/
PS:
mit der Ausnahme, dass die Ausführung eines Skripts offensichtlich kürzer ist als die Eingabe eines 3-Befehls hintereinander.
shell
command-line
Kiwy
quelle
quelle
Antworten:
Ja, es gibt einen großen Unterschied.
&&
ist kurzgeschlossen , daher würde der nachfolgende Befehl nur ausgeführt, wenn der vorherige mit einem Exit-Code von zurückgegeben würde0
.Zitat aus dem Handbuch :
Auf der anderen Seite enthält ein Skript
würde den zweiten Ausdruck ausführen, selbst wenn der erste fehlschlägt. (Es sei denn, Sie haben das Skript angegeben, das bei einem Fehler beendet werden soll
set -e
.)EDIT: In Bezug auf Ihren Kommentar, ob:
ist das gleiche wie:
Die Antwort ist normalerweise . Bash analysiert einen gesamten Anweisungsblock, bevor einer davon ausgewertet wird. EIN ; bewirkt nicht, dass der vorherige Befehl ausgewertet wird. Wenn sich der vorherige Befehl darauf auswirken würde, wie der nachfolgende analysiert wird, würden Sie den Unterschied bemerken.
Stellen Sie sich eine Datei vor, die Aliase enthält, und rufen Sie sie
alias
mit einem Eintrag auf:Betrachten Sie nun ein Skript, das Folgendes enthält:
und eine andere mit:
dann könnten Sie denken, dass beide die gleiche Ausgabe erzeugen würden.
Die Antwort ist nein. Der erste würde produzieren,
foo
aber der zweite würde berichten:Zur weiteren Klärung ist es nicht
expand_aliases
das Problem. Das Problem ist auf die Tatsache zurückzuführen, dass eine Aussage wie:würde auf einmal analysiert werden . Die Shell weiß nicht wirklich, was
f
ist, dies führt dazu, dass der Parser erstickt.quelle
command ; command2; command3
;
statt&&
?;
bewirkt nicht, dass der vorherige Befehl ausgewertet wird . Daher drosselt der Parser, wenn er auf einen unbekannten Befehl stößt.Ja,
&&
ist Zustand. Der Befehl dahinter wird nur gestartet, wenn der vorherige zurückgegeben wird0
(endet ohne Fehler). Auf der anderen Seite hat Ihr Skript diese Kontrolle nicht, wenn z. wget endet mit einem Fehler, es wird fortgesetzt und versucht, nichts zu entpacken und zu verschieben.Onliner für Ihr Skript ist:
quelle
semi colon
Entspricht das in diesem Fall dem Jumpline in meinem Skript?Ein weiterer Unterschied zu dem genannten besteht darin, dass Ihr Shell-Skript in einer separaten Shell ausgeführt wird, sodass Änderungen an der Umgebung nicht weitergegeben werden. Zum Beispiel, wenn Sie Ihre interaktive Shell eingeben
dann enthält Ihre interaktive Shell eine Variable
file
(mit der Sie lesen können$file
), die enthält,foo
ob die Datei foo existiert und eine reguläre Datei ist, undother
ansonsten. Wenn Sie dasselbe in ein Shell-Skript einfügen und dies von Ihrer interaktiven Shell aus aufrufen, wird die Variablefile
in Ihrer interaktiven Shell nicht festgelegt (aber natürlich wird sie in Ihrem Shell-Skript festgelegt, sodass Sie sie in weiteren Befehlen verwenden können darin).quelle