这些shell脚本字符(|| :)是否有用?

时间:2012-11-24 05:38:54

标签: bash shell unix sh

我有一个小的shell脚本,它运行在指定目录中可执行的任何东西,同时传递两个参数:

#!/bin/sh

cd '/foo'
for s in bar/*;
do [ -x $s ] && $s "$1" "$2" || : ;
done

|| :位是否可用于任何目的?我希望可执行文件以异步方式启动,因此我将;更改为&,但是我有任何理由不应该这样做:

#!/bin/sh

cd '/foo'
for s in bar/*;
do [ -x $s ] && $s "$1" "$2" &
done

1 个答案:

答案 0 :(得分:6)

|| :(通常拼写为|| true)表示您不关心命令是否成功。它强制成功返回状态($?)。

最好在shell的-e选项下运行shell脚本,这样就不会忽视错误。可以在shebang行(#!/bin/sh -e)或脚本本身(set -e)上激活此选项。它会导致错误中止脚本的执行。

由于在这种情况下您没有在-e下运行,|| :没有区别,因为如果命令失败,shell将无视结果代码。此外,在这种情况下,您在后台运行命令,因此检查返回代码甚至没有意义。

一般情况下,即使您未在|| true下运行,包括-e也可能有两个原因:

  • 要使其与-e兼容,以防它被更改为在-e下运行。
  • 要作为阅读shell脚本的人的文档,您可能会意识到此命令可能会失败并且这样的失败显然是正确的。