
Bashスクリプトで奇妙な動作を見つけました。
#!/bin/bash
V=a
alias $V="echo test"
echo $(a) #returns 'test'
echo $($V) #returns ...'a: not found'
変数を使用して以前の動作をシミュレートする方法はありますか?
答え1
エイリアスは、コマンドが拡張なしでコードに直接表示される場合にのみ拡張されます。\a
、など$V
を書くと、$(echo a)
エイリアス照会が抑制されます。
また、bash(他のシェルとは異なり)は基本的にスクリプトのエイリアスを拡張しないため、a
実際には次のようになります。いいえBashでエイリアスを実行します。
エイリアスの代わりに関数を使用してください。関数を定義するには、元の名前を使用する必要があります。
V=a
a () { echo test; }
"$V" # prints test
( を使用して目的を達成する他の方法がありますが、eval
実行している作業を正確に知らない限り、使用しないでくださいeval
。正しい引用がeval
難しいです。)
答え2
あなたが言ったように:
#!/bin/bash
V=a
alias $V="echo test"
echo `a` #echo the out put of the 'echo test' command which is test
echo `$V` #echo the output of $V 'command' which is holding a value itself and it won't be executed as an alias since it's not used directly.
編集する:申し訳ありません。変数をコマンドで実行できないと間違って言いました。
変数がコマンド自体の場合は実行できますが、その値がエイリアスとして使用されている場合は実行できません。この場合、エイリアスを設定したように、エイリアス値は単独で機能します。
ただし、エイリアスは変数から渡すことはできません。