メインシェルではエイリアスが使用できるのに、サブシェルでは使用できないのはなぜですか?

メインシェルではエイリアスが使用できるのに、サブシェルでは使用できないのはなぜですか?

ある文章を読んでいたのですが、そこにはこう書いてありました。

.bashrc シェル構成ファイルは、シェル スクリプトを実行するときなど、BASH シェルを生成するたびに実際に実行されます。つまり、サブシェルが作成されるたびに、.bashrc ファイルが実行されます。これにより、.bashrc シェル初期化ファイルで定義したローカル変数またはエイリアスがエクスポートされます。

また、シェルスクリプトを実行するたびに(例えばスクリプト1.sh)サブシェルが作成されます。このサブシェルが作成されると、.bashrcファイルは実行されなければならないため、エイリアスは.bashrcサブシェルで使用できる必要があります (使用できません)。また、このサブシェルでエイリアスが使用できない場合、メイン シェル (スクリプトを実行するシェル) ではどのように使用できるのでしょうか。

答え1

そうですね、Linuxのbashシェルではこう言うことができます

source /path/to/my_lib.sh

ファイルからエイリアス定義をロードします。または、複雑さを軽減するために、そのエイリアス定義を bash スクリプトにコピーするだけで済みます。

しかし、待ってください!これはエイリアスのみを作成します。おそらく

alias foo3 foo9  # describe these two aliases: declare errors if one doesn't exist

新しいエイリアス定義は役立ちますが、エイリアス拡張を有効にする前に実行すると失敗します。

shopt -s expand_aliases # alias xpn ON

以下も考慮してください:

shopt -u expand_aliases # alias xpn OFF

または

shopt  expand_aliases   # query whether

または

unalias foo3 foo9 # delete these aliases 

答え2

でエイリアスを定義しscript1.sh、それをどこでも利用できるようにしたい場合は、.bashrcファイルに以下を追加します。

source /path/to/script1.sh

または代わりに:

. /path/to/script1.sh

スクリプトが存在しない場合にエラーを回避するには、次を使用できます。

if [ -f /path/to/script1.sh ]; then source /path/to/script1.sh; fi

で定義するすべての関数に同じことが当てはまりますscript1.sh

関連情報