Shell-Script
在同一個 shell 腳本中掛載和解除安裝會導致錯誤
我需要
tar
在單個 shell 腳本中安裝一個卷、已安裝卷的內容並解除安裝該已安裝卷。所以我編碼為,
$ 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
搬進去。您不能解除安裝目前工作目錄的分區(任何程序,在本例中為 shell)。你的腳本:
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
發生在子 shell 中,它不會影響它之外的環境,並且執行腳本時的目前目錄umount
將是您執行腳本時所在的任何位置。這是一個很常見的shell構造,即做
( cd dir && somecommand )
這比嘗試到
cd
某個地方然後再返回要乾淨得多(也更清晰),尤其是在一個腳本的過程中必須進入多個目錄時。這
&&
也意味著如果由於cd
某種原因失敗,該命令將不會被執行。在您的腳本中,如果mount
失敗,您仍然會創建一個tar
空 (?) 目錄的存檔,例如,這可能不是您想要的。一個較短的變體,它使用 的
-C
標誌tar
:sudo mount -o loop Sample.iso /tmp/mnt tar -cvf /tmp/sample.tar -C /tmp/mnt . sudo umount /tmp/mnt
這使得在將目前目錄 ( ) 添加到存檔之前*
tar
*進行內部操作。但是請注意,這會導致隱藏文件或文件夾也將添加到存檔中。cd``/tmp/mnt