Ответ 1
Продолжение строки не будет выполнено, если после обратной косой черты и до новой строки есть пробелы (пробелы или символы табуляции). Без таких пробелов ваш пример отлично работает для меня:
$ 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
Некоторая деталь продвигается из комментариев: обратный слеш продолжения строки в оболочке на самом деле не является особым случаем; это просто пример общего правила, согласно которому обратный слеш предотвращает любую специальную обработку, которой обычно подвергается следующий символ. В этом случае следующий символ - это новая строка, и специальная обработка, которая запрещается, завершает командную строку. (Новая строка действительно отличается от других символов в кавычках тем, что она фактически полностью удаляется из командной строки, а не вставляется буквально.) Поскольку обратная косая черта заключает в себе только кавычки сразу после следующего символа, между обратной косой чертой и символом, который вы используете, не может быть ничего. хочу цитировать; если следующий символ после обратной косой черты является пробелом или символом табуляции, он просто цитирует этот пробел или символ табуляции, что никак не влияет на любой последующий символ новой строки.