Как разделить команду на несколько строк в оболочке, если команда является частью if
оператора?
Это работает:
if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1
fi
Это не работает:
# does not work:
if ! fab --fabfile=.deploy/fabfile.py \
--forward-agent \
--disable-known-hosts deploy:$target; then
rc=1
fi
Вместо выполнения всей команды я получаю:
./script.sh: line 73: --forward-agent: command not found
Что еще более важно, чего не хватает в моем понимании Bash, которое поможет мне понять эту и подобные проблемы в будущем?
$ if ! cp -n log/server1.log \ > .; then echo no copy; fi
без ошибок, с новой строкой после\
\
? Их довольно сложно увидеть. Если вы это сделаете, вы можете посмотреть, можете ли вы сделать так, чтобы ваш редактор убрал завершающие пробелы или сделал их более заметными.Ответы:
Продолжение строки не будет выполнено, если у вас есть пробелы (пробелы или символы табуляции) после обратной косой черты и до новой строки. Без таких пробелов ваш пример отлично работает для меня:
Некоторая деталь продвигается из комментариев: обратная косая черта продолжения строки в оболочке на самом деле не является особым случаем; это просто пример общего правила, согласно которому обратная косая черта "заключает в кавычки" непосредственно следующий за ним символ, предотвращая любую специальную обработку, которой он обычно подвергается. В этом случае следующий символ - это новая строка, и предотвращаемая специальная обработка завершает команду. Обычно заключенный в кавычки символ включается буквально в команду; символ новой строки с обратной косой чертой удаляется полностью. Но в остальном механизм тот же. И обратная косая черта указывает только следующий сразу за ним символ; если этот символ - пробел или табуляция, вы просто получаете цитируемый пробел или табуляцию, и любой последующий символ новой строки остается без кавычек.
источник
`s. For example, when adding one after the first
`, я получаю./soundops: line 73: --forward-agent: command not found
. Мои проблемы были в том, что я не понял эту ошибку. Почему наличие пробела приводит к этой ошибке? Пробел +\n
"отрицает" `` и отделяет команду?Для пользователей Windows / WSL / Cygwin и т. Д .:
Удостоверьтесь, что ваши строки заканчиваются стандартным переводом строки Unix, т.е. только
\n
(LF).Использование окончания строки в Windows
\r\n
(CRLF) приведет к разрыву строки.Это связано с тем, что
\
в конце строки с окончанием строки Windows это означает\
\r
\n
.Как правильно объясняет Марк, выше:
Это включает в себя не только space (
) или tabs (
\t
), но и возврат каретки (\r
).источник