Bashスクリプト - 戻り値が0になるまで繰り返し

Bashスクリプト - 戻り値が0になるまで繰り返し

スクリプトから何かを削除する必要がありますが、すべてのデータコピーが完了する前に削除され、削除が失敗することがあります。 「ブロックされた」削除を実行する方法を見つけましたが、何も見つかりませんでした。だから私は削除できるまで繰り返しスクリプトを書いてみましたが、うまくいきません。

while [ `sudo umount mount` ]
do
    sleep 0.1
done
rmdir mount

ランタイム出力:

umount: /home/evantandersen/mount: device is busy.
        (In some cases useful info about processes that use
         the device is found by lsof(8) or fuser(1))
rmdir: failed to remove `mount': Device or resource busy

sudo umount mount戻り値が0(成功的に削除されたことを意味)になるまで繰り返すべきではありませんか?

ベストアンサー1

この[コマンドは条件式を評価します。ここに入れても役に立ちません。

umount標準出力に何も印刷しないので(エラーはstderrに移動します)、`sudo umount mount`何も拡張されません。

そのように:

while [ ]
do
  sleep 0.1
done

[パラメータが渡されない場合は、コマンドが[返されます。]間違った(ゼロ以外の終了状態)ループに入らないようにします。

umount標準出力にエラーが印刷されても、[この出力で生成された単語は有効な条件式を形成しないため、このコマンドを使用することは意味がありません。

希望する場所は次のとおりです。

until sudo umount mount
do
  sleep 0.1
done

[つまり、コマンドの終了状態ではなくsudo / umountの終了状態を確認したいのです。

umountこれは、stderrにエラーや警告が出力されていることを確認したい場合に[便利です。これはnullをテストするために-n "some-string"コマンドによって認識される条件式なので、次のようになります。["some-string"

while [ -n "$(sudo umount mount 2>&1 > /dev/null)" ]; do
  sleep 0.1
done

しかし、エラーや警告メッセージがあるかどうかを見つけるのは一般的に悪い考えです。このumount コマンドは、より信頼性の高い終了コードを使用して成功したかどうかを示します。成功してもいくつかの警告メッセージが表示されることがあります。エラーを出力せずに失敗することがあります(終了したときと同様)。

この特別なケースでは、umountディレクトリがマウントされていないため失敗する可能性があり、この場合は永久に繰り返されるため、次のような他のアプローチを試すことができます。

while mountpoint -q mount && ! sudo umount mount; do
  sleep 0.1
done

または、「マウント」を複数回マウントすることができ、すべてマウント解除したい場合:

while mountpoint -q mount; do
  sudo umount mount || sleep 0.1
done

おすすめ記事