Jak mogę podzielić polecenie na wiele wierszy w powłoce, gdy polecenie jest częścią if
instrukcji?
To działa:
if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1
fi
To nie działa:
# does not work:
if ! fab --fabfile=.deploy/fabfile.py \
--forward-agent \
--disable-known-hosts deploy:$target; then
rc=1
fi
Zamiast wykonania całego polecenia otrzymuję:
./script.sh: line 73: --forward-agent: command not found
Co ważniejsze, czego brakuje w moim rozumieniu Bash, które pomogą mi zrozumieć tę i podobne problemy w przyszłości?
$ if ! cp -n log/server1.log \ > .; then echo no copy; fi
bez błędu, z nowym wierszem po\
\
? Trudno je zobaczyć. Jeśli tak, możesz sprawdzić, czy możesz zmusić edytora do usunięcia końcowych spacji lub zwiększenia ich widoczności.Odpowiedzi:
Kontynuacja linii nie powiedzie się, jeśli po odwrotnym ukośniku i przed nową linią występują białe spacje (spacje lub znaki tabulacji). Bez takich białych znaków twój przykład działa dla mnie dobrze:
Niektóre szczegóły promowane z komentarzy: odwrotny ukośnik kontynuacji linii w powłoce nie jest tak naprawdę szczególnym przypadkiem; jest to po prostu przykład ogólnej zasady, że ukośnik odwrotny „cytuje” bezpośrednio następujący po nim znak, zapobiegając jakiemukolwiek specjalnemu traktowaniu, któremu normalnie by się poddał. W tym przypadku następnym znakiem jest nowa linia, a specjalnym zapobieganiem jest zakończenie polecenia. Zazwyczaj cytowany znak pojawia się dosłownie w poleceniu; znak nowej linii z odwrotnym ukośnikiem jest zamiast tego całkowicie usuwany. Ale poza tym mechanizm jest taki sam. Odwrotny ukośnik cytuje tylko bezpośrednio następujący znak; jeśli ten znak jest spacją lub tabulatorem, otrzymasz po prostu cytowaną spację lub tabulator, a każda kolejna nowa linia pozostanie bez cudzysłowu.
źródło
`s. For example, when adding one after the first
`, rozumiem./soundops: line 73: --forward-agent: command not found
. Moje problemy polegały na tym, że nie zrozumiałem tego błędu. Dlaczego spacja powoduje ten błąd? Biała spacja +\n
„neguje” znak „i ogranicza polecenie?Dla użytkowników Windows / WSL / Cygwin itp .:
Upewnij się, że zakończenia linii są standardowymi uniksowymi liniami, tj
\n
. Tylko (LF).Korzystanie z zakończeń linii systemu Windows
\r\n
(CRLF) spowoduje przerwanie podziału wiersza poleceń.Wynika to z faktu, że posiadanie
\
na końcu linii z zakończeniem linii Windows przekłada się na\
\r
\n
.Jak Mark poprawnie wyjaśnia powyżej:
Dotyczy to nie tylko spacji (
) lub tabulatorów (
\t
), ale także znaku powrotu karetki (\r
).źródło