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

时间:2012-06-23 19:07:36

标签: bash

我是bash的新手,我想为bash别名包含一个env ..我想做类似以下的事情

alias foo="bar $(baz)"

所以我可以做类似下面的事情

> baz=40
> foo

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

2 个答案:

答案 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增加了额外的异常,因此环境分配的工作方式将更加复杂。我建议不要使用它们,除非你真的知道你在做什么。