私のBashスクリプトがエイリアスを認識しないのはなぜですか?

私のBashスクリプトがエイリアスを認識しないのはなぜですか?

私の~/.bashrcファイルには2つの定義があります。

  1. commandA、これは長いパスのエイリアスです。
  2. commandB、これはBashスクリプトのエイリアスです。

これら2つのコマンドを使用して同じファイルを処理したいので、次のBashスクリプトを作成しました。


#!/bin/bash

for file in "$@"
    do
    commandA $file
    commandB $file
done

セッションからログアウトして再ログインした後もcommand not foundこのスクリプトを実行すると、Bashは両方のコマンドに対してエラーメッセージを表示します。

私は何が間違っていましたか?

答え1

bashのマンページを見ると、次のようになります。

シェルが非対話型の場合、Shoptを使用してExpand_aliasesシェルオプションを設定しない限り、エイリアスは拡張されません(以下のSHELL BUILTIN COMMANDSの下のshoptの説明を参照)。

だから

shopt -s expand_aliases

あなたのスクリプトから。

エイリアスファイルをスクリプトで設定してからインポートする必要があります。

shopt -s expand_aliases
source ~/.bash_aliases

答え2

まず、ddeimekeが言ったように、エイリアスは非対話型シェルではデフォルトでは拡張されません。

第二に、.bashrc環境変数を設定しないと、非対話型シェルはそれを読みませんBASH_ENV

しかし、最も重要なことはしないでください!どうぞ?ある日、必要なエイリアスが設定されていない場所にスクリプトを移動すると、再び動作が停止します。

代わりに、スクリプトで変数をショートカットに設定して使用してください。

#!/bin/bash

CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh

for file in "$@"
do
    $CMDA "$file"
    $CMDB "$file"
done

答え3

エイリアスはエクスポートできないため、エイリアスを定義しないシェルスクリプトでは使用できません。つまり、 で定義することは~/.bashrcできませんyour_script.sh~/.bashrc推奨されませんが、スクリプトからソースコードをインポートしない限り、これを正しく実行する方法があります)。

ただし、関数をエクスポートして、その関数を定義された環境で実行されているシェルスクリプトで使用できるようにすることはできます。 bashrcに次のように入力します。

フー()
{
    「Hello World!」のエコー
}
エクスポート -f foo

Bashのマニュアルによると、「ほとんどすべての目的でシェル関数はエイリアスより優れています」

答え4

.スクリプトの前に使用することもできます。次のように実行します。

. /path/to/your/script.sh

次のように、bashスクリプトでこの状況を確認できます。

if [[ $- == *i* ]]
then
    echo "running on interactive mode. aliases will work!"
fi

関連情報