Shell 脚本是否按顺序执行命令?

Sil*_*ash 9 shell bash shell-script

我有一个 python 脚本,它有点不稳定,时不时会出现 SSL 错误。异常是由深埋在某个库中的某个函数引发的,因此基本上没有修复它。

我通过创建一个带有 while 循环的 shell 脚本来实现一个 hacky 解决方案,该脚本运行大量次并从该循环内执行 python 脚本。

现在我希望的是,当循环的迭代开始并执行脚本时,shell 脚本内的循环保持原样,直到 python 脚本失败并且循环的下一次迭代重新执行脚本等等在。

这样做有效率吗?有没有更好的方法来做到这一点?最重要的是它是否正确?

Sté*_*las 16

在:

cmd1
cmd2
Run Code Online (Sandbox Code Playgroud)

或者

cmd1; cmd2
Run Code Online (Sandbox Code Playgroud)

它们按顺序执行。

cmd1 && cmd2
Run Code Online (Sandbox Code Playgroud)

或者

cmd1 || cmd2
Run Code Online (Sandbox Code Playgroud)

它们按顺序cmd2执行,但是否完全执行取决于是cmd1成功(for &&)还是失败(for ||)。

cmd1 | cmd2
Run Code Online (Sandbox Code Playgroud)

或者

cmd1 & cmd2
cmd1 |& cmd2 # ksh
coproc cmd1; cmd2 # bash/zsh
Run Code Online (Sandbox Code Playgroud)

或者

cmd1 <(cmd2) # ksh/zsh/bash (also yash though with a different meaning)
Run Code Online (Sandbox Code Playgroud)

它们是并发执行的。在第一种情况下,一些 shell 只cmd2在继续执行脚本的其余部分之前等待,而另一些则同时等待两者。在第二种情况下,shells 只等待cmd2cmd1被称为异步运行(或在交互式 shell 中运行时在后台运行)),而在第三种情况下cmd1cmd2异步)。

在:

< "$(cmd1)" x=$(cmd2) y=$(cmd3) cmd4 "$(cmd5)" > "$(cmd6)"
Run Code Online (Sandbox Code Playgroud)

命令按顺序运行,但顺序取决于 shell。在任何情况下,cmd4都会最后执行。

在:

cmd1 =(cmd2) # zsh
Run Code Online (Sandbox Code Playgroud)

它们按顺序执行(cmd2首先)。

请注意,在所有这些情况下,这些命令中的任何一个都可以启动其他进程。外壳程序不知道它们,因此不可能等待它们。