我尝试从 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 $?
行将永远不会被执行。