bash 中复杂别名的返回值是什么?

bash 中复杂别名的返回值是什么?

当我执行一个已作为一系列命令别名的命令时,返回到 shell 的值是什么?另外,假设我有一个如下定义的别名:

alias doit 'cd ~/some/dir; ./my_app; cd -'

我怎样才能使返回值./my_app返回整个别名命令的返回值?

答案1

别名几乎就是文本替换。因此,在别名定义之后,键入doit相当于键入cd ~/some/dir; ./my_app; cd -。这是一个语法正确的命令列表,其返回值是序列中最后一个命令的返回值,此处为cd -

其他答案展示了保存中间命令状态并返回它的一般方法。但是,在这个特定情况下,有一种更好的方法来表达这个操作序列:不是切换到另一个目录然后再​​改回来,而是在子 shell 中执行需要不同当前目录的操作,这样 shell 的当前目录就不会发生任何变化。

doit () {
  (cd ~/some/dir && ./my_app "$@")
}

我还做了另外两项改进:

  • 在命令之间使用&&而不是,以便在命令失败时;不尝试执行。my_appcd
  • 允许将参数传递给my_app:如果运行doit foo barmy_app则使用两个参数foo和进行调用bar

答案2

返回的值是最后执行的命令的退出状态。

也许你应该使用一个函数来代替:

函数 doit
{
    cd〜/一些/目录
    ./我的应用
    本地 X=$?
    光盘 -
    返回 $X
}

man Bash

$? Expands to the status of the most recently executed foreground pipeline.

笔记:local命令确保没有修改任何全局变量(同名)。

答案3

shell 中的代码块通常返回块中最后一个命令的返回值。在您的例子中,该命令的返回值是cd -,它不太可能失败。

我认为你可以通过将该别名转换为 shell 函数来获得你想要的东西:

doit () {  
    cd ~/some/dir  
    ./my_app  
    RETVAL=$?  
    cd -  
    return $RETVAL  
}

相关内容