web-dev-qa-db-ja.com

非インタラクティブBashシェルのエイリアスが機能しない理由

非インタラクティブbashシェルでエイリアスを使用しようとしています。エイリアスを~/.bashrcで定義し、変数BASH_ENV=~/startUpFileを設定しました。 startUpFileの内容はsource ~/.bashrcです。

aliasコマンドを実行すると、エイリアスが認識されていることがわかります。ただし、~/.bashrcで定義されているエイリアスを使用しようとすると、Bashはそれを認識できません。不明なコマンドエラーが表示されます。

TCSHシェルを使用すると、~/.cshrcファイルが常に読み取られるため、これを行うのは非常に簡単です。

Bashシェルでこれを行う方法を教えてください。

45
nisah

コマンド shopt -s expand_aliasesは、非対話型シェルでのエイリアス展開を許可します。

46
Jim Lewis

.bashrcはインタラクティブシェルによってのみ処理されます。

また、expand_aliases Shellオプションがshoptを使用して設定されていない限り、シェルがインタラクティブでない場合、エイリアスは展開されません。もちろん、POSIXモードは、shではなくbashという名前でシェルを呼び出すことによって呼び出されます。

多くの場合、エイリアスを使用する人は、プロファイルの最後に.bashrcを提供するため、非インタラクティブシェルでもエイリアスが存在します。これは最善の方法ではないかもしれませんが、かなり一般的です。

21世紀には、Pythonのような本格的な言語を支持してシェルスクリプトを放棄すべきだと私が考えるようになったのは、このようなことです。それははるかに予測可能です。

15
Michael Dillon

必ず

shopt -s expand_aliases

BASH_ENVでポイントされているファイル内

9
Vinko Vrsalovic

私は同様の問題を抱えていましたが、結局、必要なのは〜/ .bashrcだけであることがわかりました。

しかし、Ubuntuでは、〜/ .bashrcの処理を停止する行をコメント化する必要がありました。

If not running interactively, don't do anything
[ -z "$PS1" ] && return
3
tomaszbak