Die Zeilenfortsetzung schlägt fehl, wenn Sie Leerzeichen (Leerzeichen oder Tabulatoren¹) hinter dem Backslash und vor dem Zeilenumbruch haben. Ohne solche Leerzeichen funktioniert Ihr Beispiel für mich einwandfrei:
$ cat test.sh
if ! fab --fabfile=.deploy/fabfile.py \
--forward-agent \
--disable-known-hosts deploy:$target; then
echo failed
else
echo succeeded
fi
$ alias fab=true; . ./test.sh
succeeded
$ alias fab=false; . ./test.sh
failed
Einige Details aus den Kommentaren hervorgehoben: Der Zeilenumbruch-Backslash in der Shell ist nicht wirklich ein spezieller Fall; es ist einfach eine Instanz der allgemeinen Regel, dass ein Backslash das unmittelbar folgende Zeichen "zitiert", was verhindert, dass es einer speziellen Behandlung unterzogen wird. In diesem Fall ist das nächste Zeichen ein Zeilenumbruch, und die spezielle Behandlung, die verhindert wird, besteht darin, dass der Befehl beendet wird. Normalerweise wird ein zitiertes Zeichen wörtlich in den Befehl aufgenommen; ein durch Backslash gekennzeichneter Zeilenumbruch wird stattdessen vollständig gelöscht. Aber sonst ist der Mechanismus derselbe. Am wichtigsten ist, dass der Backslash nur das unmittelbar folgende Zeichen zitiert; wenn dieses Zeichen ein Leerzeichen oder Tabulator ist, erhalten Sie einfach ein wörtliches Leerzeichen oder Tabulatoren; der Backslash hat keine Auswirkungen auf einen anschließenden Zeilenumbruch.
¹ oder Wagenrückläufe, wie Czechnology feststellt. Die POSIX-Shell verträgt sich nicht mit Windows-formatierten Textdateien, nicht einmal in WSL. Oder Cygwin, aber zumindest hat ihr Bash-Port eine igncr
-Option hinzugefügt, die Sie mit set -o
verwenden können, um sie gegen Wagenrücklässe toleranter zu machen.