如何在终端外部传播错误代码?

如何在终端外部传播错误代码?

我尝试从 bash 脚本内部检索在新终端窗口中启动的程序的错误代码。它可以简化为:

#!/bin/bash
urxvt -e bash -c "exit 4"
echo $?

输出:0

我想访问我的脚本中调用 urxvt 的“4”。请问我该怎么做? :)

答案1

AFAIK 图形终端没有uxvrt任何实用程序可以为您提供在其上运行的程序的返回代码。

我想到的最好、最直接的方法是在你的内部运行一个子外壳bash(看起来有点混乱,但相信我),并在内部运行你想要的任何程序bash,并使用外部外壳来处理返回代码,如下所示如下:

urxvt -e bash -c ' (exit 4) ; echo $? > error.code '

现在您可以从文件中读取返回代码error.code

请注意,临时文件的存在是必要的,因为如果您只是echo返回代码,它会打印在urxvt窗口中,该窗口本身将在几千秒后关闭。所以您不会得到任何有用的东西。

答案2

这是对帕萨·穆萨维 (Parsa Mousavi) 答案的扩展。尽管它可以完成这项工作,但如果您要执行的内容比 更复杂,那么您将失去引号的跟踪,exit 4情况可能就是如此。

更灵活的选择是

#!/bin/bash
myfunc(){
    (
    #Other statements...
    exit 4
    )
    echo $? > errorcode
}

export -f myfunc

uxrvt -e bash -c 'myfunc'
echo "Error code:"
cat errorcode

导出是必要的,以便bash在新终端中执行的程序也能获得该功能。

POSIX shell 不允许函数导出。对于可移植的替代方案,为了简单起见,请在同一目录中创建两个脚本:

main

#!/bin/sh
urxvt -e sh -c './secondary'
echo "Error code of secondary:"
cat errorcode

secondary

#!/bin/sh
myfunc(){
    #Here your statements...
    exit 4
}

(myfunc)
echo $? > errorcode

使两者可执行 ( chmod +x main secondary) 并运行./main。你应该得到

Error code of secondary:
4

请注意,它myfunc在子 shell 中运行,否则程序将被终止并且该echo $?行将永远不会被执行。

相关内容