Bagaimana saya bisa membagi perintah ke beberapa baris di shell, ketika perintah itu merupakan bagian dari if
pernyataan?
Ini bekerja:
if ! fab --fabfile=.deploy/fabfile.py --forward-agent --disable-known-hosts deploy:$target; then rc=1
fi
Ini tidak berfungsi:
# does not work:
if ! fab --fabfile=.deploy/fabfile.py \
--forward-agent \
--disable-known-hosts deploy:$target; then
rc=1
fi
Alih-alih seluruh eksekusi perintah, saya mendapatkan:
./script.sh: line 73: --forward-agent: command not found
Lebih penting lagi, apa yang hilang dari pemahaman saya tentang Bash yang akan membantu saya memahami ini dan masalah serupa di masa depan?
$ if ! cp -n log/server1.log \ > .; then echo no copy; fi
tanpa kesalahan, dengan baris baru setelah\
\
? Mereka sangat sulit dilihat. Jika ya, Anda mungkin ingin melihat apakah Anda dapat membuat editor menghapus spasi tambahan atau membuatnya lebih terlihat.Jawaban:
Garis-kelanjutan akan gagal jika Anda memiliki spasi (spasi atau karakter tab) setelah garis miring terbalik dan sebelum baris baru. Tanpa spasi seperti itu, contoh Anda berfungsi dengan baik untuk saya:
Beberapa detail dipromosikan dari komentar: backslash garis-kelanjutan dalam shell sebenarnya bukan kasus khusus; itu hanyalah sebuah contoh dari aturan umum bahwa garis miring terbalik "mengutip" karakter yang langsung mengikuti, mencegah setiap perlakuan khusus yang biasanya dikenakan. Dalam hal ini, karakter berikutnya adalah baris baru, dan perlakuan khusus yang dicegah adalah menghentikan perintah. Biasanya, karakter yang dikutip akhirnya dimasukkan secara harfiah dalam perintah; baris baru backslashed malah dihapus seluruhnya. Tetapi sebaliknya, mekanismenya sama. Dan garis miring terbalik hanya mengutip karakter yang langsung mengikuti; jika karakter itu adalah spasi atau tab, Anda hanya mendapatkan spasi atau tab yang dikutip, dan baris baru berikutnya tetap tidak dikutip.
sumber
`s. For example, when adding one after the first
`, saya mengerti./soundops: line 73: --forward-agent: command not found
. Masalah saya adalah saya tidak mengerti kesalahan ini. Mengapa memiliki spasi putih menghasilkan kesalahan itu? Ruang putih +\n
"meniadakan" the `` dan membatasi perintah?Untuk pengguna Windows / WSL / Cygwin dll:
Pastikan bahwa akhir baris Anda hanya feed garis Unix standar, yaitu
\n
(LF) saja.Menggunakan ujung baris Windows
\r\n
(CRLF) ujung baris akan memecah istirahat baris perintah.Ini karena memiliki
\
di akhir baris dengan Windows berakhiran diterjemahkan menjadi\
\r
\n
.Seperti yang dijelaskan Mark dengan benar di atas:
Ini termasuk tidak hanya space (
) atau tabs (
\t
) tetapi juga carriage return (\r
).sumber