我正在尝试获得此调用的结果
TMP=$(find /mydir/ -type f -mmin +1440 | xargs rm -f)
M=$?
不幸的是,如果/mydir/
不存在,则$?
的结果仍为“0
”,就像没有问题一样。如果0
没有返回任何内容,我想获得不'find
'的内容。
我该怎么办?
答案 0 :(得分:2)
归因于link:
bash版本3引入了一个选项,用于更改管道的退出代码行为,并将管道的退出代码报告为最后一个程序的退出代码,以返回非零退出代码。只要测试程序之后的程序都没有报告非零退出代码,管道就会将其退出代码报告为测试程序的退出代码。要启用此选项,只需执行:
set -o pipefail
然后
TMP=$(find /mydir/ -type f -mmin +1440 | xargs rm -f)
M=$?
将表现不同并识别错误。
另请参阅StackOverflow上的上一个post
最好,
杰克。
答案 1 :(得分:1)
您可以启用bash
的{{1}}选项。文档(来自pipefail
):
help set
所以,你可以写成:
pipefail the return value of a pipeline is the status of
the last command to exit with a non-zero status,
or zero if no command exited with a non-zero status
另外,为什么要在set -o pipefail
TMP=$(find /mydir/ -type f -mmin +1440 | xargs --no-run-if-empty rm -f)
M=$?
set +o pipefail
内执行find
命令?如果您不希望它输出错误,请将STDERR重定向到$( ... )
,并且最好将/dev/null
或-r
标记用于--no-run-if-empty
,以避免如果它没有从管道接收任何输入,则运行该命令。
答案 2 :(得分:0)
检查bash中是否存在目录:
if [ ! -d "mydir" ]; then
exit 1 #or whatever you want, control will stop here
fi
TMP=$(find /mydir/ -type f -mmin +1440 | xargs rm -f)
...