在同一个 shell 脚本中挂载和卸载会导致错误

在同一个 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)。

在同一脚本中是否有任何方法(安装、焦油、卸载)?

聚苯乙烯:脚本完成后我可以卸载 /tmp/mnt 卷。

答案1

您需要退出该目录才能卸载它,如下所示:

#!/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

这就对了。

答案2

该设备处于“繁忙”状态,因为您刚刚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

这使得tarcd在将当前目录 ( /tmp/mnt) 添加到存档之前执行内部操作。但请注意,这会导致隐藏的文件或文件夹也将添加到存档中。

相关内容