在另一个脚本中获取最后一个shell命令的退出代码



我正在尝试加强我的通知脚本。脚本的工作方式是,我将其放在长期运行的shell命令后面,然后在长期运行脚本完成后将调用各种通知。

例如:

sleep 100; my_notify

获取长期运行脚本的退出代码会很不错。问题是调用my_notify创建一个无法访问$?变量的新过程。

比较:

~ $: ls nonexisting_file; echo "exit code: $?"; echo "PPID: $PPID"
ls: nonexisting_file: No such file or directory
exit code: 1
PPID: 6203

vs。

~ $: ls nonexisting_file; my_notify
ls: nonexisting_file: No such file or directory
exit code: 0
PPID: 6205

my_notify脚本中有以下内容:

#!/bin/sh
echo "exit code: $?"
echo "PPID: $PPID"

我正在寻找一种获取上一个命令的退出代码的方法,而不会太多更改命令的结构。我知道,如果将其更改为更像time,例如my_notify longrunning_command...我的问题将得到解决,但我实际上很喜欢我可以在命令结束时处理它,并且我担心第二个解决方案的并发症。

可以做到这一点,还是从根本上与外壳工作方式完全不相容?

我的外壳是z外壳(zsh),但我也希望它也可以与bash一起使用。

您确实需要使用shell功能来实现这一目标。对于这样的简单脚本,在ZSH和BASH中都可以使用它应该很容易。只需将以下内容放在文件中:

my_notify() {
  echo "exit code: $?"
  echo "PPID: $PPID"
}

然后从您的Shell启动文件中获取该文件。尽管这将是从您的交互式外壳中运行的,因此您可能需要使用$$而不是$ PPID。

它是不兼容的。$? 仅存在当前外壳内;如果要在子过程中可用,则必须将其复制到环境变量。

替代方法是编写以某种方式使用它的外壳函数。

实现此功能的一种方法可能是使用eof tag和一个将创建您的my_notify脚本的主脚本。


#!/bin/bash
if [ -f my_notify ] ; then
rm -rf my_notify
fi
if [ -f my_temp ] ; then
rm -rf my_temp
fi
retval=`ls non_existent_file &> /dev/null  ; echo $?`
ppid=$PPID
echo "retval=$retval" 
echo "ppid=$ppid" 
cat >> my_notify << 'EOF'
#!/bin/bash
echo "exit code: $retval"
echo " PPID =$ppid"
EOF
sh my_notify 

您可以为您的目的完善此脚本。

相关内容

  • 没有找到相关文章