シェルスクリプトはコマンドを順番に実行しますか?

シェルスクリプトはコマンドを順番に実行しますか?

少し不安定で、時々SSLエラーを引き起こすPythonスクリプトがあります。一部のライブラリに深く埋め込まれた一部の関数によって例外が発生するため、デフォルトでは回避策はありません。

私は何度も実行されるwhileループを使用してシェルスクリプトを生成し、ループ内でPythonスクリプトを実行してハッキーソリューションを実装しました。

今私が望むのは、ループ反復が開始され、スクリプトが実行されたときにPythonスクリプトが失敗し、ループの次の反復がスクリプトを再実行するまで、シェルスクリプト内のループが元の場所に保持されることです。 。

これは効率的ですか?もっと良い方法がありますか?最も重要なことは正しいですか?

ベストアンサー1

存在する:

cmd1
cmd2

または

cmd1; cmd2

順次実行されます。

存在する

cmd1 && cmd2

または

cmd1 || cmd2

順番に実行されますが、cmd2実行されるかどうかは完全にcmd1成功(for &&)または失敗(for ||)によって異なります。

存在する

cmd1 | cmd2

または

cmd1 & cmd2
cmd1 |& cmd2 # ksh
coproc cmd1; cmd2 # bash/zsh

または

cmd1 <(cmd2) # ksh/zsh/bash (also yash though with a different meaning)

同時に実行されます。最初のケースでは、一部のシェルは残りのスクリプトを続行する前にのみ待機しcmd2、他のシェルは両方のスクリプトを待機します。 2番目のケースでは、シェルは待機しますcmd2cmd1非同期的に実行されるといいます(またはインタラクティブシェルで実行されている場合はバックグラウンドで実行されます))。一方、3番目のケースではcmd1cmd2非同期的に)実行されます。

存在する:

< "$(cmd1)" x=$(cmd2) y=$(cmd3) cmd4 "$(cmd5)" > "$(cmd6)"

コマンドは順次実行されますが、順序はシェルによって異なります。とにかくcmd4最後に実行されます。

存在する:

cmd1 =(cmd2) # zsh

順番に(まず)実行されますcmd2

これらのすべてのケースでは、これらのコマンドは他のプロセスを開始できます。シェルはこれについて知らないので、それを待つことは不可能です。

おすすめ記事