コマンドがステートメントの一部である場合、シェル内でコマンドを複数行に分割するにはどうすればよいですか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 に関する私の理解に欠けているものは何でしょうか?
ベストアンサー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
コメントから引用した詳細: シェルの行継続バックスラッシュは実際には特別なケースではありません。バックスラッシュは直後の文字を「引用」し、通常行われる特別な処理を阻止するという一般的な規則の単なる例です。この場合、次の文字は改行であり、阻止される特別な処理はコマンドの終了です。通常、引用された文字はコマンドに文字通り含まれ、バックスラッシュ付きの改行は完全に削除されます。ただし、それ以外の点ではメカニズムは同じです。最も重要なのは、バックスラッシュは直後の文字のみを引用することです。その文字がスペースまたはタブである場合、文字通りのスペースまたはタブが取得されます。バックスラッシュは後続の改行には影響しません。
¹ あるいは、Czechnology が指摘しているように、キャリッジ リターンもサポートしていません。POSIX シェルは、WSL でも Windows 形式のテキスト ファイルに対応していません。または Cygwin ですが、少なくとも Bash ポートには、キャリッジ リターンを許容するigncr
オプションが追加されています。set -o