我在 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(与其他 shell 不同)默认情况下不会扩展脚本中的别名,所以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.
编辑:抱歉,我说变量不能作为命令执行是错误的。
如果变量是命令本身,则可以执行它,但当其值用作别名时则不能执行。在这种情况下,作为别名的值可以单独工作,因为就像您设置了一个别名一样。
但别名不能从变量传递。