我正在尝试加强我的通知脚本。脚本的工作方式是,我将其放在长期运行的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
您可以为您的目的完善此脚本。