【问题标题】:BASH get error code in parent terminal from child terminal?BASH从子终端获取父终端中的错误代码?
【发布时间】:2014-09-14 13:18:51
【问题描述】:

在 bash 脚本中,我使用一个给出错误的命令启动一个新终端。但是我似乎无法获取该错误代码:

#! /bin/bash
gnome-terminal -x bash -c "cat dksdamfasdlm"
echo $?

输出:

0

所以我得到了gnome-terminal 命令的错误代码,而不是cat 一个。我得到的一个建议是用代码制作一个文件并从父 bash 中读取它。问题是我似乎仍然无法以这种方式阅读错误代码:

#! /bin/bash
gnome-terminal -x bash -c "cat dksdamfasdlm; echo $?; sleep 2"

输出(在新终端上):

cat: dksdamfasdlm: No such file or directory
0

这是为什么呢?关于如何解决这个问题的一些建议?我只是想以某种方式从父 bash 中获取新终端中的错误。

【问题讨论】:

  • 您为什么要这样做?除非您正在测试 GNOME 终端本身,否则您应该直接运行脚本而不是通过终端。
  • 我正在尝试制作一个为应用程序(Docker)打开不同终端的 BASH 脚本。但是,我希望能够捕获任何错误..
  • 您能否提供更多背景信息?我还是不明白你为什么要使用终端而不仅仅是运行脚本。
  • 这是一个复杂的场景。我想从终端运行这个脚本。该脚本应该打开一个新终端,该终端将连接到正在运行的虚拟机。父终端也应该连接到虚拟机。但是,如果启动的终端无法成功连接到 VM,则脚本应立即退出,而不是尝试连接到 VM。
  • 您可以将第一个连接作为后台,然后您可以在同一个脚本中进行两个连接,而无需生成单独的终端。

标签: bash process parent-child error-code gnome-terminal


【解决方案1】:

似乎 GNOME 终端在启动后立即退出,如果您运行例如 gnome-terminal -x sleep 10,这一点很明显。由于它不等待命令完成,因此返回码不可能是命令的返回码。我在gnome-terminal --help-all 中找不到将进程保持在前台的选项。

关于您的第二个问题,您已经将命令加倍-quoted,因此$? 在运行之前 被扩展。这应该有效:

gnome-terminal -x bash -c 'cat dksdamfasdlm; echo $?; sleep 2'

PS:-x 选项在 GNOME 终端 3.8.4 的 gnome-terminal --help-all 中没有记录,various references 没有多大帮助,并且没有很好的解释为什么有一个相同的 -e 选项语义和不同的语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2019-08-29
    • 1970-01-01
    • 2023-03-11
    • 2021-05-17
    相关资源
    最近更新 更多