我需要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
这使得tar
cd
在将当前目录 ( /tmp/mnt
) 添加到存档之前执行内部操作。但请注意,这会导致隐藏的文件或文件夹也将添加到存档中。