【问题标题】:Capturing exit value of previous command in bash prompt在 bash 提示符中捕获上一个命令的退出值
【发布时间】:2013-08-14 09:45:19
【问题描述】:

如何在我的 bash 提示符中捕获上一个命令的退出值?我想这样做是因为我也想在我的路径中包含当前的 git 分支,这会改变$?

我在以下提示符上尝试了很多变体(例如,围绕分配给 RETVAL 的 `、` 和 $()),但 RETVAL 在所有这些中都是空的:

PS1="\$(RETVAL=$(echo \$))\$(cd 124123)retval: $RETVAL"

里面的 cd 命令只是一个占位符,用于调用 git 当前分支函数,然后我在回显 RETVAL(这总是一个空字符串来测试它是否被分配。

其他类似/相关的问题:

我也尝试使用这些页面上的示例在提示命令中设置 RETVAL,但提示中没有显示任何内容

【问题讨论】:

    标签: bash command-prompt exit-code


    【解决方案1】:

    创建一个生成提示的函数,并保存$?

    makeprompt() { 
        status=$?
        echo "$(echo someoutput) $status"
        return $status
    }
    
    PS1='$(makeprompt) \$ '
    

    这将为您提供命令的输出(此处为 echo,但可能为 git),以及先前执行的命令的退出状态。

    【讨论】:

    • 感谢您提出这个回复 - 我认为它让我大部分时间都在那里。现在的问题是没有正确解析 bash 路径。例如。我有:makeprompt() { echo = "\n$ " }(在代码中使用正确的空格),但它确实将我的提示设置为字符串“\n $”,并且没有在它之前放置一个空的新行。当然,我的实际提示比颜色代码和 git 分支解析功能更复杂,但它不适合这个评论框。它以同样的方式失败。编辑:推送返回而不是移位返回并提前发表评论
    • 特殊 PS1 变量(如本例中的 \$),必须按字面意思指定,并且不能在 makeprompt 中回显。对于换行,您可以使用echo -e '\n\n\n foo'。请记住,makeprompt 不能输出尾随换行符,因为 $(..) 会删除它们。
    • 我在提示符中使用了很多(\u、\h、\D 等),但我能够将它们全部替换为变量,所以我现在全部排序。感谢您的所有帮助:)
    【解决方案2】:

    来自 bash(1)

    PROMPT_COMMAND
      If set, the value is executed as a command  
      prior  to  issuing  each  primary prompt.
    

    使用这个,而不是 PS1。您对 PS1 的分配会在分配时扩展一次,但不是每次显示提示时。是的,当它被展示时,会进行一些扩展,但它是有限的(并且使用 -style 替换“变量” - 再次,请参阅 bash(1))。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-05
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-13
      • 1970-01-01
      相关资源
      最近更新 更多