34

私は bash にかなり慣れていないので、bash エイリアスの env を含めたいと思っています。次のようなことをしたいです。

alias foo="bar $(baz)"

次のようなことができるように

> baz=40
> foo

そして foo は command に展開されbar 40ます。現在、エイリアスの作成中に $(baz) が展開されるため、上記は機能しません。これを関数などにラップする必要がありますか?

4

3 に答える 3

66

'エイリアスを作成するときにbashが変数を展開しないようにするには、一重引用符()を使用する必要があります。

$ alias foo='echo "$bar"'
$ bar="hello"
$ foo
hello
于 2012-06-23T19:11:29.250 に答える
7

エイリアスには「環境」がありません。エイリアスは、単に「ダム」テキスト置換です。質問では、環境変数は使用されていません。シェル変数のみが使用されています。環境を利用したい場合は、関数を使用してください。この場合、関数よりもエイリアスの利点はありません。

$ alias foo='echo "$bar"'
$ bar=hi foo

単純なコマンドに設定された環境は拡張に適用されないため、これは出力を生成しません。

$ alias foo=$'eval \'echo "$bar"\''
$ bar=hi foo
hi

代わりに関数を使用すれば、問題はありません。

$ foo() { echo "$bar"; }
$ bar=hi foo
hi

疑わしい場合は、常に関数を使用してください。

編集

技術的には、上記はbashのみです。完全にポータブルな方法でこれを行うことはほぼ不可能です。

dash、mksh、bash POSIXモード、およびその他のPOSIXシェルでは、次のことができます。

foo() { echo "$bar"; }
bar=hi command eval foo

ただし、これはksh93またはzshでは機能しません。(ksh93のバグはすでに報告していますが、修正されない可能性があります。)mkshおよびksh93では、代わりにfunctionキーワードを使用して関数を定義する必要がありますが、それはPOSIXではありません。私はどこでも機能する解決策を知りません。

さらに悪いことに、POSIX 2008-TC1に追加の例外が追加されているため、環境の割り当ての動作はさらに複雑になります。自分が何をしているのかを本当に理解していない限り、それらを使用しないことをお勧めします。

于 2012-06-23T19:32:20.560 に答える