Wie kann ich einen Befehl über mehrere Zeilen in der Shell aufteilen, wenn der Befehl Teil einer if
Anweisung ist?
Das funktioniert:
if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1
fi
Das funktioniert nicht:
# does not work:
if ! fab --fabfile=.deploy/fabfile.py \
--forward-agent \
--disable-known-hosts deploy:$target; then
rc=1
fi
Anstatt den gesamten Befehl auszuführen, erhalte ich:
./script.sh: line 73: --forward-agent: command not found
Noch wichtiger ist, was fehlt in meinem Verständnis von Bash, das mir helfen wird, dieses und ähnliche Probleme in Zukunft zu verstehen?
$ if ! cp -n log/server1.log \ > .; then echo no copy; fi
ohne Fehler ausführen , mit einem Zeilenumbruch nach\
\
? Sie sind ziemlich schwer zu sehen. In diesem Fall möchten Sie möglicherweise prüfen, ob Sie Ihren Editor dazu bringen können, nachgestellte Leerzeichen zu entfernen oder sie besser sichtbar zu machen.Antworten:
Die Zeilenfortsetzung schlägt fehl, wenn Sie nach dem Backslash und vor der neuen Zeile Leerzeichen (Leerzeichen oder Tabulatorzeichen) haben. Ohne solche Leerzeichen funktioniert Ihr Beispiel gut für mich:
Einige Details, die aus den Kommentaren hervorgehen: Der Zeilenumbruch in der Shell ist kein Sonderfall. Es ist lediglich ein Beispiel für die allgemeine Regel, dass ein Backslash das unmittelbar folgende Zeichen "zitiert" und so jede Sonderbehandlung verhindert, der es normalerweise unterliegen würde. In diesem Fall ist das nächste Zeichen eine neue Zeile, und die spezielle Behandlung, die verhindert wird, beendet den Befehl. Normalerweise wird ein zitiertes Zeichen buchstäblich in den Befehl aufgenommen. Ein umgekehrter Zeilenumbruch wird stattdessen vollständig gelöscht. Ansonsten ist der Mechanismus der gleiche. Und der Backslash zitiert nur das unmittelbar folgende Zeichen; Wenn es sich bei diesem Zeichen um ein Leerzeichen oder eine Registerkarte handelt, wird nur ein Leerzeichen oder eine Registerkarte in Anführungszeichen gesetzt, und alle nachfolgenden Zeilenumbrüche bleiben ohne Anführungszeichen.
quelle
`s. For example, when adding one after the first
` Leerzeichen Leerzeichen hinzufüge./soundops: line 73: --forward-agent: command not found
. Mein Problem war, dass ich diesen Fehler nicht verstanden habe. Warum führt ein Leerzeichen zu diesem Fehler? Das Leerzeichen +\n
"negiert" das `` und begrenzt einen Befehl?Für Benutzer von Windows / WSL / Cygwin usw.:
Stellen Sie sicher, dass Ihre Zeilenenden Standard-Unix-Zeilenvorschübe sind, dh nur
\n
(LF).Bei Verwendung von
\r\n
CRLF-Zeilenenden ( Windows Line Endings ) wird der Befehlszeilenumbruch unterbrochen.Dies liegt daran, dass
\
das Ende einer Zeile mit dem Windows-Zeilenende in übersetzt wird\
\r
\n
.Wie Mark oben richtig erklärt:
Dies umfasst nicht nur Leerzeichen (
) oder Tabulatoren (
\t
), sondern auch den Wagenrücklauf (\r
).quelle