Bash:声明要在单个多行命令中使用的别名

时间:2016-09-28 07:44:21

标签: bash

我想做点什么

alias myls=ls && myls

这给了我一个错误

bash: myls: command not found

奇怪的是,随后的

myls

会在同一会话中得到承认。

您是否知道如何声明在同一命令序列中使用的别名?

3 个答案:

答案 0 :(得分:2)

根据bash manual

  

关于别名的定义和使用的规则有些令人困惑。   在执行任何输入之前,Bash总是读取至少一个完整的输入行   那条线上的命令。 读取命令时会扩展别名,而不是   什么时候执行。因此,别名定义出现在同一行上   因为另一个命令在读取下一行输入后才会生效。   该行上别名定义后面的命令不受该行的影响   新别名。执行函数时,此行为也是一个问题。别名   读取函数定义时扩展,而不是在执行函数时扩展,   因为函数定义本身就是一个复合命令。作为结果,   在执行该函数之后,函数中定义的别名才可用。   为安全起见,请始终将别名定义放在单独的行中,   并且不要在复合命令中使用别名。

     

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

答案 1 :(得分:1)

alias必须在单独的一行使用,所以即使这样也不行:

alias myls=ls; myls

这会导致-bash: myls: command not found错误。

但是,您可以使用function并在同一行使用它:

myls() { ls "$@"; } && myls

答案 2 :(得分:1)

anubhava已经提供了更好的answer,但如果由于某种原因你不想使用函数而不是别名那么你可以做

alias myls=ls && eval myls

但请注意,eval的使用会引入额外的扩展级别,这可能会导致更复杂命令的意外行为:

$ echo "A    B"
A    B
$ eval echo "A    B"
A B
$ echo '$SHELL'
$SHELL
$ eval echo '$SHELL'
/bin/bash