次のスクリプトがあります。
#!/bin/bash
set -x
if :; then
echo a
fi
を実行するとbash /tmp/file
エコーa
が表示されますが、実行すると次の結果が表示さsource /tmp/file
れます。
bash: /tmp/test: line 6: syntax error: unexpected end of file
出力:
knezi@holly tmp]$set -x; source /tmp/test; set +x
+ source /tmp/test
++ set -x
bash: /tmp/test: line 6: syntax error: unexpected end of file
+ set +x
knezi@holly tmp]$set -x; command source /tmp/test; set +x
+ set -x
+ command source /tmp/test
+ source /tmp/test
++ set -x
bash: /tmp/test: line 6: syntax error: unexpected end of file
+ set +x
knezi@holly tmp]$bash -c "source /tmp/test"
+ bash -c 'source /tmp/test'
++ :
++ echo a
a
knezi@holly tmp]$od -c /tmp/test
0000000 # ! / b i n / b a s h \n s e t
0000020 - x \n i f : ; t h e n \n \t e
0000040 c h o a \n f i \n
0000051
コマンドの出力はshopt -p
次のとおりですset -o
。http://pastebin.com/bsqc8aru
出力set
:http://pastebin.com/S9KpqZAL
declare -fp
何も生産されません。
source
のように見えますが、新しいbash
セッションを開始するのではなく、現在のセッションでコードを実行します。誰でも私にこのエラーを説明できますか?
私はbash GNU bashバージョン4.2.53(1)-リリース(x86_64-redhat-linux-gnu)を実行しています。
答え1
エイリアスを使用すると、動作を再現できますfi
。
$ alias fi=:
+ alias fi=:
$ . ./test
+ . ./test
++ set -x
bash: ./test: line 6: syntax error: unexpected end of file
実行時には機能しますが、非対話型シェル(シェルスクリプトを実行するシェルタイプ)ではエイリアスを使用できないため、インポートすると失敗します。説明したようにバッシュマニュアル:
シェルが非対話型の場合、
expand_aliases
シェルオプションを使用して設定しないと、エイリアスは拡張されませんshopt
(参照:内蔵店舗)。
しかし、source
何かをすると、現在のシェルで実行され、インタラクティブなので、エイリアスがすでにロードされているので、エイリアスが認識されてfi
ソースが壊れます。