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


9

それぞれの引数をコマンドとして実行する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

回答:


9

いくつかのテストの後、私は次のことを結論付けました:

  • エイリアスはインタラクティブモードでのみ機能します(-iシバンに追加)。
  • エイリアスは、解釈されたソース(この場合は変数)からのものである場合は評価されません。
  • bashでエイリアスを使用することができますeval $1eval変数で作成されたものを使用することは危険ですが、スクリプトの全体のポイントは任意の実行を必要とするので、私はそれについてあまり大きなことはしません。

bashのmanページから:

シェルがインタラクティブでない場合、エイリアスは展開されません。ただし、expand_aliasesシェルオプションがshoptを使用して設定されている場合を除きます(下記のシェルビルドコマンドの下のshoptの説明を参照してください)。

したがって、のshopt -s expand_aliases代わりに追加できます-i

また、

エイリアスは、コマンドが実行されるときではなく、読み取られるときに展開されます。

変数はコマンドが読み込まれる前に展開されないため、エイリアスを使用してさらに展開されることはありません。


1
知っておくといい。好奇心から抜け出して:なぜeval変数にとって危険なのですか?

1
@hesseを検討してくださいeval "echo $1"。電話すると言う./script.sh "hello;rm -rf ~。何が実行されますか?echo hello、続いてrm -rf ~。明らかにそれは不自然な例ですが、原則は成り立ちます。
ケビン

私はすでに持っていたのでeval$1働いた前に追加しshopt -s expand_aliasesます。ありがとう!
ジェイソン

1

私は同様の問題を抱えており、このサイトで説明されているように、エイリアスを関数に変換して問題を解決することができました。

例えば

alias lsd="ls -lash"

function lsd() { ls -lash; }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.