「強く打った」なら「効果があるのとその理由」ソース「エラーが発生しましたか?

「強く打った」なら「効果があるのとその理由」ソース「エラーが発生しましたか?

次のスクリプトがあります。

#!/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 -ohttp://pastebin.com/bsqc8aru

出力sethttp://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ソースが壊れます。

関連情報