我是bash的新手,我想为bash别名包含一个env ..我想做类似以下的事情
alias foo="bar $(baz)"
所以我可以做类似下面的事情
> baz=40
> foo
和foo将扩展为命令bar 40
。目前上述方法不起作用,因为在制作别名时扩展了$(baz)。我是否必须将其包装在函数或其他内容中?
答案 0 :(得分:40)
您需要使用单引号('
)来防止bash在创建别名时扩展变量:
$ alias foo='echo "$bar"'
$ bar="hello"
$ foo
hello
答案 1 :(得分:4)
别名没有“环境”。别名只是一种“哑”文本替换。在这个问题中,没有使用环境变量 - 只有shell变量。如果要使用该环境,请使用函数。在这种情况下,函数的别名没有优势。
$ alias foo='echo "$bar"'
$ bar=hi foo
这不会产生输出,因为为简单命令设置的环境不适用于扩展。
$ alias foo=$'eval \'echo "$bar"\''
$ bar=hi foo
hi
如果使用某个功能,则不会出现问题。
$ foo() { echo "$bar"; }
$ bar=hi foo
hi
如有疑问,请始终使用功能。
修改强>
从技术上讲,以上只是bash-only。以完全可移植的方式执行此操作几乎是不可能的。
在dash,mksh,bash POSIX模式和其他POSIX shell中,您可以这样做:
foo() { echo "$bar"; }
bar=hi command eval foo
但是,这在ksh93或zsh中不起作用。 (我已经报告了ksh93的一个错误,但它可能永远不会修复。)在mksh和ksh93中,您应该使用function
关键字定义函数,但这不是POSIX。我不知道任何可以在任何地方使用的解决方案。
更糟糕的是,POSIX 2008-TC1增加了额外的异常,因此环境分配的工作方式将更加复杂。我建议不要使用它们,除非你真的知道你在做什么。