「bash <file>」が機能する場合、「source <file>」がエラーをスローするのはなぜですか?


26

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

#!/bin/bash
set -x
if :; then
    echo a
fi

実行するとbash /tmp/fileaエコーされますが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)-release(x86_64-redhat-linux-gnu)を実行します。


1
いいえ、これはコード全体です。改行は0aです。
knezi

2
@Rahul Unix改行文字の16進コード
PSkocik

2
ある$BASH_ENVセットは?
ロアイマ

2
@PSkocikそれは本当に奇妙です。bash -c "source / tmp / test"は機能します。
knezi

5
ああ!それが機能するbash -cことを質問に追加してください。次に、~/.bashrcファイルの内容を表示します。おそらく、何かを台無しにしているものがそこにあります。
テルドン

回答:


75

私がエイリアスする場合、私はあなたの行動を再現できますfi

$ alias fi=:
+ alias fi=:
$ . ./test
+ . ./test
++ set -x
bash: ./test: line 6: syntax error: unexpected end of file

実行すると機能しますが、ソースを使用すると、非対話型シェル(シェルスクリプトを実行するシェルの種類)ではエイリアスが使用できないため、失敗します。bashマニュアルで説明されているように:

シェルが対話式でない場合、expand_aliasesシェルオプションがを使用して設定されていない限り、エイリアスは展開されません shoptThe Shopt Builtinを参照)。

ただし、source何かを実行すると、現在のシェルで実行されます。このシェルは対話型であるため、エイリアスが既に読み込まれているため、fiエイリアスが認識され、ソーシングが中断されます。


16
あなたは完全に正しいです。次のように設定しました:alias fi = 'find -type f | xargs grep -H '。
knezi

7
alias今すぐそれを取り除きます!:)
マークスチュワート

9
誰もそのようなあいまいな問題を理解することに成功したことに驚いています。よくやった、先生。
MathematicalOrchid

6
@MathematicalOrchid私は何かが、(理由は対話型シェルの)エイリアスされたことを疑わset出力によって除外された、およびalias if='foo "'(末尾のオープン引用符が欠落している引用符についてのエラーを与え、そして最後のオプションは、エイリアシングたのでfi
muru
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.