私の~/.bashrc
ファイルには2つの定義があります。
commandA
、これは長いパスのエイリアスですcommandB
、これはBashスクリプトのエイリアスですこれら2つのコマンドで同じファイルを処理したいので、次のBashスクリプトを作成しました。
#!/bin/bash
for file in "$@"
do
commandA $file
commandB $file
done
セッションからログアウトして再度ログインした後でも、Bashはcommand not found
このスクリプトを実行すると、両方のコマンドでエラーが発生します。
何が悪いのですか?
まず第一に、ddeimekeが言ったように、デフォルトではエイリアスは非対話型シェルでは展開されません。
次に、.bashrc
環境変数を設定しない限り、BASH_ENV
は非インタラクティブシェルによって読み取られません。
しかし、最も重要なことは、それを行わないことです。お願いします?ある日、必要なエイリアスが設定されていない場所にそのスクリプトを移動すると、再び壊れます。
代わりに、スクリプトのショートカットとして環境変数を設定して使用します。
#!/bin/bash
CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh
for file in "$@"
do
$CMDA "$file"
$CMDB "$file"
done
Bashのマンページを見ると、次のことがわかります。
シェルがインタラクティブでない場合、エイリアスは展開されません。ただし、expand_aliasesシェルオプションがshoptを使用して設定されている場合を除きます(下記のシェルの組み込みコマンドの下のshoptの説明を参照してください)。
だから置く
shopt -s expand_aliases
あなたのスクリプトで。
スクリプトでこれを設定した後、必ずエイリアスファイルを入手してください。
shopt -s expand_aliases
source ~/.bash_aliases
エイリアスはエクスポートできないため、定義されていないシェルスクリプトでは使用できません。言い換えると、それらを~/.bashrc
で定義した場合、your_script.sh
を使用できません(スクリプトで~/.bashrc
をソースに指定しない限り、お勧めしませんが、実行する方法があります。これは正しく)。
ただし、関数はエクスポートすることができ、関数が定義されている環境から実行されるシェルスクリプトで使用できます。これは、これをbashrcに配置することで実行できます。
foo() { echo "Hello World!" } export -f foo
Bashのマニュアルにあるように、「ほとんどすべての目的で、エイリアスよりもシェル関数が優先されます。」
[cmd line] > bash -i [your script's file path]
i
はインタラクティブなもので、bash
プロファイルを提供します。