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

Мне нужно смонтировать том, tar содержимое смонтированного тома и размонтировать смонтированный том в одном сценарии оболочки.

Поэтому я закодировал,

 $ 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).

Есть ли способ обойти (монтировать, 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 для его перемещения. Вы не можете размонтировать раздел текущего рабочего каталога (любого процесса, в данном случае оболочки).

Ваш скрипт:

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

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

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