ボリュームtar
をマウントし、マウントされたボリュームのコンテンツをマウントして、マウントされたボリュームを1つのシェルスクリプトでマウント解除する必要があります。
だから私は次のようにコーディングしました、
$ cat sample.sh
Sudo mount -o loop Sample.iso /tmp/mnt
cd /tmp/mnt
tar-cvf /tmp/sample.tar *
Sudo umount /tmp/mnt
エラーが発生しましたumount: /tmp/mnt: device is busy.
だから私はチェックしました
$ lsof /tmp/mnt
現在の「sh」ファイルを出力します。だから私は自分自身を確信しました、/tmp/mnt
は現在のスクリプトでビジーです(この場合、sample.sh)。
同じスクリプトで(mount、tar、unmount)を回避する方法はありますか?
PS:/ tmp/mntボリュームを一度アンマウントできますスクリプトが終了します。
次のように、ディレクトリをアンマウントするには、ディレクトリを終了する必要があります。
#!/bin/bash
Sudo mount -o loop Sample.iso /tmp/mnt
cd /tmp/mnt
tar -cvf /tmp/sample.tar *
#Got to the old working directory. **NOTE**: OLDPWD is set automatically.
cd $OLDPWD
#Now we're able to unmount it.
Sudo umount /tmp/mnt
それだ。
cd
を使用して移動したため、デバイスは「ビジー」です。現在の作業ディレクトリ(任意のプロセス、この場合はシェル)のパーティションをアンマウントすることはできません。
あなたのスクリプト:
Sudo mount -o loop Sample.iso /tmp/mnt
cd /tmp/mnt
tar -cvf /tmp/sample.tar *
Sudo umount /tmp/mnt
同じ問題のない変更されたスクリプト:
Sudo mount -o loop Sample.iso /tmp/mnt
( cd /tmp/mnt && tar -cvf /tmp/sample.tar * )
Sudo umount /tmp/mnt
cd
はサブシェルで発生するため、それ以外の環境には影響せず、umount
の時点の現在のディレクトリは、スクリプトを実行したときの場所にあります。
これは非常に一般的なシェル構成です。つまり、
( cd dir && somecommand )
特に1つのスクリプトの実行中に複数のディレクトリに移動する必要がある場合は、どこかでcd
を実行してから再度実行するよりも、はるかにクリーン(かつ明確)です。
&&
を使用すると、何らかの理由でcd
が失敗した場合にコマンドが実行されないことも意味します。スクリプトで、mount
が失敗した場合でも、たとえば空の(?)ディレクトリのtar
アーカイブを作成しますが、これは望んでいない場合があります。
tar
の-C
フラグを利用する短いバリアント:
Sudo mount -o loop Sample.iso /tmp/mnt
tar -cvf /tmp/sample.tar -C /tmp/mnt .
Sudo umount /tmp/mnt
これにより、現在のディレクトリ(/tmp/mnt
)をアーカイブに追加する前に、内部でtar
cd
を実行します。ただし、これにより、隠しファイルまたはフォルダーもアーカイブに追加されることに注意してください。