壳牌:分析回报

时间:2013-07-19 14:01:19

标签: linux shell

我正在尝试获得此调用的结果

TMP=$(find /mydir/ -type f -mmin +1440 | xargs rm -f)
M=$?

不幸的是,如果/mydir/不存在,则$?的结果仍为“0”,就像没有问题一样。如果0没有返回任何内容,我想获得'find'的内容。

我该怎么办?

3 个答案:

答案 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)
...