私は bash にかなり慣れていないので、bash エイリアスの env を含めたいと思っています。次のようなことをしたいです。
alias foo="bar $(baz)"
次のようなことができるように
> baz=40
> foo
そして foo は command に展開されbar 40
ます。現在、エイリアスの作成中に $(baz) が展開されるため、上記は機能しません。これを関数などにラップする必要がありますか?
私は bash にかなり慣れていないので、bash エイリアスの env を含めたいと思っています。次のようなことをしたいです。
alias foo="bar $(baz)"
次のようなことができるように
> baz=40
> foo
そして foo は command に展開されbar 40
ます。現在、エイリアスの作成中に $(baz) が展開されるため、上記は機能しません。これを関数などにラップする必要がありますか?
'
エイリアスを作成するときにbashが変数を展開しないようにするには、一重引用符()を使用する必要があります。
$ alias foo='echo "$bar"'
$ bar="hello"
$ foo
hello
エイリアスには「環境」がありません。エイリアスは、単に「ダム」テキスト置換です。質問では、環境変数は使用されていません。シェル変数のみが使用されています。環境を利用したい場合は、関数を使用してください。この場合、関数よりもエイリアスの利点はありません。
$ 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に追加の例外が追加されているため、環境の割り当ての動作はさらに複雑になります。自分が何をしているのかを本当に理解していない限り、それらを使用しないことをお勧めします。