私は各引数をコマンドとして実行するbashスクリプトを書いています。これはmyのコマンドには機能しますPATH
が、エイリアスには機能しません。エイリアスはスクリプトから直接呼び出すことができますが、パラメータとして渡されたエイリアスは呼び出すことはできません。
問題は、エイリアスが変数の前に拡張されることです。変数でエイリアスを実行する方法はありますか?
スクリプト例:
#!/bin/bash
# File: runall
shopt -s expand_aliases
source ~/.aliases
while (( "$#" )); do
$1
shift
done
runall "echo test"
動作しますが、runall "myalias"
提供runall: line 8: myalias: command not found
ベストアンサー1
いくつかのテストを経て、次の結論に達しました。
-i
エイリアスは対話モード(shebangに追加)でのみ機能します。- エイリアスは、解釈されたソース(この場合は変数)から来ると評価されません。
- bashにエイリアスを使用するように指示できます
eval $1
。変数を使用して生成されたすべてはeval
危険ですが、スクリプトの全体的なポイントはランダムな実行を必要とするので、あまり扱いません。
Bashのマニュアルページから:
シェルが非対話型の場合、Shoptを使用してExpand_aliasesシェルオプションを設定しない限り、エイリアスは拡張されません(以下のSHELL BUILTIN COMMANDSの下のshoptの説明を参照)。
shopt -s expand_aliases
したがって、代わりに追加できます-i
。
返品、
エイリアスは、コマンドの実行時ではなく、コマンドの読み込み時に拡張されます。
変数はコマンドが読み込まれるまで拡張されないため、エイリアスを使用して拡張されなくなります。