3

次のようなシェル スクリプトを考えてみましょう。

loop()
{
    while true; do
        sleep 10
        return 1
    done &

    return 0
}

loop
exit 0

while 句はバックグラウンドで実行されていますが、関数loop()が返され、スクリプトが終了しました。

このreturn 1句は構文エラーのように見えますが、コンソールには実際にはエラー メッセージは出力されません。

このreturn 1句の結果、どのような動作が発生しますか?

編集:

return 1スクリプト内のすべてのコマンドは子プロセスで実行されていますが(大まかに)、私の質問は句に焦点を当てています。このコマンドは関数コンテキストで実行する必要がありますが、実行中に関数コンテキストが破棄されました。したがって、このreturn 1句の動作は奇妙で不明確です。何か案が?

4

2 に答える 2

2

次のことを考慮してください

openvas:~$ vi test.sh
loop()
{
    while true; do
        sleep 10
        echo "1" 
        ps -fu openvas
        return 1
    done &

    echo "2"
    ps -fu openvas
    return 0
}

loop

echo "3"
ps -fu openvas
exit 0

結果

openvas:~$ sh test.sh 
2
UID        PID  PPID  C STIME TTY          TIME CMD
openvas     13653 13603  0 16:22 pts/2    00:00:00 sh test.sh
openvas     13654 13653  0 16:22 pts/2    00:00:00 sh test.sh
openvas     13655 13653  0 16:22 pts/2    00:00:00 ps -fu openvas
openvas     13656 13654  0 16:22 pts/2    00:00:00 sleep 10
3
UID        PID  PPID  C STIME TTY          TIME CMD
openvas     13653 13603  0 16:22 pts/2    00:00:00 sh test.sh
openvas     13654 13653  0 16:22 pts/2    00:00:00 sh test.sh
openvas     13656 13654  0 16:22 pts/2    00:00:00 sleep 10
openvas     13657 13653  0 16:22 pts/2    00:00:00 ps -fu openvas
1
UID        PID  PPID  C STIME TTY          TIME CMD
openvas     13654     1  0 16:22 pts/2    00:00:00 sh test.sh
openvas     13658 13654  0 16:23 pts/2    00:00:00 ps -fu openvas

最初の ps 出力 (echo 2) では、このスクリプトが呼び出されると、bash が PID 13653 を割り当てていることが明らかです。これにより、while ループに 13654 が割り当てられます。次に、親 13654 から PID 13656 で sleep コマンドが呼び出されます。元のスクリプト自体から ps コマンドが呼び出されます。

2 番目の ps 出力 (echo 3) では、同じパターンに従っています。

3 番目の ps 出力 (echo 1) では、PID 13654 には 13653 ではなく親 1 があることがわかりますThis shows that init adopts this orphan. 。親プロセスはすでに実行を完了しており、子が親の PID をチェックするまでに終了したためです。これにより、プロセス ID が 1 の init の下で子プロセスの親が変更されました。

あなたの場合、スクリプトが return 0 で終了すると、ループは破棄されず (PID 13654)、return 1 に遭遇して中断するまで続きます。

于 2013-11-05T15:35:08.180 に答える