Shell-Script

在同一個 shell 腳本中掛載和解除安裝會導致錯誤

  • January 20, 2017

我需要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

引用自:https://unix.stackexchange.com/questions/338884