我尝试了一种实现互联网最大线程的实现方式。我尝试过:
#!/bin/bash
echo "$BASH_VERSION"
echo "$-"
processes=4
i=0
((i=i%$processes)); ((i++==0)) && wait
此操作失败,在aws的DNANexus平台上没有任何错误消息。另一方面,当我将其重写为:
#!/bin/bash
echo "$BASH_VERSION"
echo "$-"
processes=4
i=0
(( ++i % $processes == 0 )) && wait
该代码有效。 bash版本为4.3.11(1)-release,外壳标志为ehB
任何人都可以尝试猜测为什么会在云上发生这种情况,而在OsX和Ubuntu 18.04本地版本中两个版本都能正常工作吗?
谢谢!
答案 0 :(得分:1)
这是set -e
的操作,该标志也称为errexit
。
在以下情况下:
((i=i%$processes)); ((i++==0)) && wait
...命令(( i++ == 0 ))
被视为有条件的命令,因此避免了errexit
通常由(( i++ == 0 ))
引起的非零退出状态中止的行为,对于{{ 1}},而不是(( i=i%$processes ))
,在bash版本中,bash没有明确的例外,不会受到set -e
行为的影响。
请参阅BashFAQ #105,练习2。