私の~/.bashrc
ファイルには2つの定義があります。
commandA
、これは長いパスのエイリアスです。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