Монтирование и размонтирование в одном сценарии оболочки приводит к ошибке

2 ответа

Вам нужно выйти из каталога, чтобы размонтировать его, вот так:

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

Вот и все .

15
27.01.2020, 20:31

Устройство "занято", так как вы только что использовали компакт-диск , чтобы войти в него. Вы не можете размонтировать раздел текущего рабочего каталога (любого процесса, в данном случае оболочки).

Ваш сценарий:

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 будет там, где вы были, когда выполняли скрипт.

Это очень распространенная конструкция оболочки, то есть to do

( 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 ) в архив. Однако обратите внимание, что в результате в архив также будут добавлены скрытые файлы или папки.

11
27.01.2020, 20:31

Теги

Похожие вопросы