在linux中,如果我在一个包含别名的脚本中放入一个命令,我发现它没有被扩展。我该如何解决这个问题?我正在使用bash。
答案 0 :(得分:4)
根据TLDP page about aliases,您需要在代码中使用行shopt -s expand_aliases
来扩展别名。下面的例子产生了预期的输出,但没有shopt线它只打印“my_ls:command not found”:
#!/bin/bash
shopt -s expand_aliases
alias my_ls='ls -lrt'
echo "Trying my_ls"
my_ls
exit
答案 1 :(得分:1)
如果希望shell别名在脚本中可用,则必须手动包含它们。如果在~/.bashrc
中定义了它们,请添加一行
. ~/.bashrc
在脚本中的#!/bin/sh
行之后。这将在脚本的上下文中执行.bashrc的内容。
答案 2 :(得分:0)
启用posix模式(例如将bash调用为sh
或使用命令(set -o posix) 2>/dev/null && set -o posix
)应该可以解决问题。
即便如此,请注意别名在解析时会进行扩展,并且解析和执行之间的顺序定义不明确。例如
alias foo=echo; foo bar
或
{
alias foo=echo
foo bar
}
将尝试运行foo
,因为别名尚未在解析时定义。此外,有些shell在执行任何shell之前解析eval
或.
(source)的整个输入。
因此,在脚本中使用别名的唯一可移植且可靠的方法是定义它们,然后eval
或.
使用它们的代码。