Bash:変数にエイリアスを使用する

Bash:変数にエイリアスを使用する

私は各引数をコマンドとして実行する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

返品、

エイリアスは、コマンドの実行時ではなく、コマンドの読み込み時に拡張されます。

変数はコマンドが読み込まれるまで拡張されないため、エイリアスを使用して拡張されなくなります。

おすすめ記事