如何在bash的别名中包含环境变量?

如何在bash的别名中包含环境变量?,bash,Bash,我对bash还很陌生,我想为bash别名添加一个env。。我想做如下的事情 alias foo="bar $(baz)" > baz=40 > foo 这样我就可以做如下的事情 alias foo="bar $(baz)" > baz=40 > foo foo将扩展到命令bar 40。目前,上述方法不起作用,因为$(baz)在生成别名时被展开。是否必须将其包装在函数或其他内容中?您需要使用单引号(”)来防止bash在创建别名时扩展变量: $ alias foo='

我对bash还很陌生,我想为bash别名添加一个env。。我想做如下的事情

alias foo="bar $(baz)"
> baz=40
> foo
这样我就可以做如下的事情

alias foo="bar $(baz)"
> baz=40
> foo

foo将扩展到命令
bar 40
。目前,上述方法不起作用,因为$(baz)在生成别名时被展开。是否必须将其包装在函数或其他内容中?

您需要使用单引号(
)来防止bash在创建别名时扩展变量:

$ alias foo='echo "$bar"'
$ bar="hello"
$ foo
hello
别名没有“环境”。别名只是一种“哑”文本替换。在这个问题中,没有使用环境变量——只使用shell变量。如果要使用环境,请使用函数。在这种情况下,别名与函数相比没有任何优势

$ alias foo='echo "$bar"'
$ bar=hi foo
这不会产生任何输出,因为为简单命令设置的环境不适用于扩展

$ alias foo=$'eval \'echo "$bar"\''
$ bar=hi foo
hi
如果改用函数,就不会有问题

$ foo() { echo "$bar"; }
$ bar=hi foo
hi
如有疑问,请始终使用函数

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

从技术上讲,以上只是bash。以完全可移植的方式进行此操作几乎是不可能的

在dash、mksh、bash POSIX模式和其他POSIX shell中,您可以执行以下操作:

foo() { echo "$bar"; }
bar=hi command eval foo
但是,这在ksh93或zsh中不起作用。(我已经报告了ksh93的一个bug,但它可能永远不会被修复。)在mksh和ksh93中,您应该使用
function
关键字定义函数,但这不是POSIX。我不知道有哪种解决方案在任何地方都能奏效


更糟糕的是,POSIX 2008-TC1中添加了额外的异常,因此环境分配的工作方式将更加复杂。除非你真的知道自己在做什么,否则我建议不要使用它们。

还有
alias test=echo\$bar
(同样的想法,扩展被抑制)正确答案,只是小心使用别名
test
,这是一个实际的命令。
alias foo='echo'$bar'
。不需要导出