コードブロックでいつreturn 0とreturn 1を使用するかを知りたいです。
誰かがこれについて詳しく説明してもらえますか?
ベストアンサー1
Bashでは関数のすべての値を返すことができますが、8ビットに切り捨てられて符号がなくなります。 $?でチェックすると、0..255の範囲にあります。状態を提供するためにreturnを使用しないと、関数は関数内で実行された最後のコマンドの状態を返します。
同じ$?代替メカニズムは、外部コマンドおよびユーザー機能から状態を取得するために使用されます。ただし、外部コマンドには異なる予約値があります。大規模なスクリプトでは、呼び出しがシェル関数なのか外部コマンドなのかは明確ではないので、次のような同じ規則に従うことをお勧めします。
0: 成功。 shell -eオプションが有効になっていると、コマンドが実際に機能してもゼロ以外の状態を返すと、スクリプトは終了します。
> 128:コマンドが信号によって終了したため、完了状態に戻ることができません。システムが提供する状態は(128+信号番号)です.
127: シェルが新しいプロセスを開始しましたが、コマンドが見つかりません。
126: シェルが新しいプロセスを開始しましたが、コマンドが実行できないことがわかりました。
これに関する私の参考資料は次のとおりです。
https://www.gnu.org/software/bash/manual/bash.html#Exit-Status
同じ文書のセクション 4.3.1 には、Bash が状態 0 に特別な意味を割り当てる方法を示す set -e の説明が含まれています。これは、各コマンドマニュアルページの終了ステータスセクションで確認されます。
これには「フォークできません」コードは表示されません。 126と127はどちらもシェル自体の子プロセスから返されたようです。 fork()は間違いなく失敗します(-1、errno EAGAIN、またはENOMEMを返します)。ただし、Bashは結果の状態を指定しません。明らかに失敗した場合、それを処理する子プロセスはありません。
最大ユーザープロセス数を設定し、新しいbashを開始する実験では、Bashが中断され、状態を読み取ろうとすると応答しなくなりました。
Paul--) prlimit --nproc=400: bash
paul@paul-RV415-RV515 ~ $ export PS1='Limited--) '
Limited--) for j in {1..500}; do
> sleep 300 &
> Rc=$?
> (( Rc > 0 )) && { echo "${Rc}"; break; }
> done
[1] 5954
[2] 5955
....
[53] 6006
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
[54] 6007
[55] 6008
bash: fork: retry: Resource temporarily unavailable
....
[59] 6012
bash: fork: retry: Resource temporarily unavailable
bash: fork: retry: Resource temporarily unavailable
bash: fork: Resource temporarily unavailable
Limited--) RC=$?
^C
^C^C
## Killed from another terminal.