【问题标题】:bash: propagating exit code of command executed in aliasbash:传播在别名中执行的命令的退出代码
【发布时间】:2013-08-14 07:08:57
【问题描述】:

在 bash 中,我想传播在别名中执行的特定命令的退出代码,以便别名调用本身会返回它(与它一起退出)。

想象一下下面的例子(请注意:命令没有意义,只是演示了我面临的问题):

alias cda='cd \/a; exit_code=$?; echo "STATUS: $exit_code"; alias cdb='cd \/b'
cda && cdb

对我来说,没有这样的目录:/a 和 /b 以确保命令失败。 我只想在cda 别名执行成功的情况下执行cdb 别名。但是,由于echo 是最后一个命令,它以exit 状态结束0 => 两者都被执行

我试过的是:

alias cda='cd \/a; exit_code=$?; echo "STATUS: $exit_code"; exit $exit_code'; alias cdb='cd \/b'
cda && cdb

但是这完全退出了 shell => 对我来说不可行。

知道如何将退出状态(在我的情况下为 $exit_code)传播为别名退出状态吗?

【问题讨论】:

    标签: bash alias exit-code


    【解决方案1】:

    最好只使用函数而不是别名:

    cda() {
        cd /a
        exit_code=$?
        echo "STATUS: $exit_code"
        return "$exit_code" # optional
    }
    
    cdb() {
        cd /b
        exit_code=$?
        echo "STATUS: $exit_code"
        return "$exit_code" # optional
    }
    

    至于别名你可以尝试在最后添加一个测试:

    alias cda='cd \/a; exit_code=$?; echo "STATUS: $exit_code"; [[ exit_code -eq 0 ]]'; alias cdb='cd \/b'
    

    【讨论】:

    • 感谢您的回答,这对我有用。剩下的唯一问题是它是否可以纯粹通过别名来实现。
    【解决方案2】:

    我的.bashrc 中有这个函数:

    return_exitcode(){
        return $1
    }
    

    模拟任何所需的退出代码(未完成输入检查。)。

    这样,别名将是:

    alias cda='cd /a; exit_code=$?; echo "STATUS: $exit_code"; return_exitcode $exit_code'
    alias cdb='cd /b; exit_code=$?; echo "STATUS: $exit_code"; return_exitcode $exit_code'
    

    注意事项:

    1. 使用函数总是优于别名。因此 konsolebox 的答案是正确的答案。
    2. 添加这个答案只是因为这个小功能有时很方便,同时用;一个接一个地编写命令...

    【讨论】:

      猜你喜欢
      • 2016-10-10
      • 1970-01-01
      • 2020-03-27
      • 2019-08-04
      • 2018-09-25
      • 2012-01-02
      • 2019-02-27
      • 2010-12-30
      • 1970-01-01
      相关资源
      最近更新 更多