13

我无法让 expand_aliases 在 bash 中生效。我尝试了很多不同的东西,但没有任何效果。

这是一个简单的测试用例:

/bin/bash -c 'shopt -s expand_aliases; alias cdtmp="cd /tmp"; alias; cdtmp; pwd;'

和输出:

$ /bin/bash -c 'shopt -s expand_aliases; alias cdtmp="cd /tmp"; alias; cdtmp; pwd;'
alias cdtmp='cd /tmp'
/bin/bash: cdtmp: command not found
/home/user

$ /bin/bash --version
GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

(是的,我使用 shopt 而不是 -O 选项来 bash,只是为了证明它正在完成。)

有任何想法吗?

4

3 回答 3

14

别名在定义它们的同一行或同一函数中不可用。

从 Bash 手册页:

       关于别名的定义和使用的规则有些
       令人困惑。Bash 总是读取至少一行完整的输入
       在执行该行上的任何命令之前。别名是
       在读取命令时展开,而不是在执行时展开。所以,
       别名定义与另一个命令出现在同一行
       在读取下一行输入之前不会生效。命令
       遵循该行上的别名定义不受新的影响
       别名。执行函数时,此行为也是一个问题。
       读取函数定义时扩展别名,而不是
       函数被执行,因为函数定义本身就是一个 com-
       磅命令。因此,函数中定义的别名不是
       在执行该函数之前可用。为了安全,永远
       将别名定义放在单独的行中,并且不要在 COM 中使用别名
       磅命令。

       对于几乎所有用途,别名都被 shell 函数所取代。

Bash参考手册

对于几乎所有目的,shell函数都比别名更受欢迎。

而不是上面的最后一句话[强调我的]。我认为别名是一种命令行便利,而不是应该在脚本中使用的东西(包括那些仅由bash -c单行组成的)。

于 2010-03-23T18:11:50.517 回答
2

我迟到了 10 年。您可以使用eval使别名cdtmp再次展开。

/bin/bash -c 'shopt -s expand_aliases; alias cdtmp="cd /tmp"; alias; eval cdtmp; pwd;'

会给你输出

alias cdtmp='cd /tmp'
/tmp
于 2020-04-20T23:08:34.500 回答
0

尝试/bin/bash -O expand_aliases -c 'xx'

于 2020-12-23T08:58:51.047 回答