O dispositivo está "ocupado", já que você usou cd
para entrar nele. Você não pode desmontar a partição do diretório de trabalho atual (de qualquer processo, neste caso o shell).
Seu script:
sudo mount -o loop Sample.iso /tmp/mnt
cd /tmp/mnt
tar -cvf /tmp/sample.tar *
sudo umount /tmp/mnt
Script modificado sem o mesmo problema:
sudo mount -o loop Sample.iso /tmp/mnt
( cd /tmp/mnt && tar -cvf /tmp/sample.tar * )
sudo umount /tmp/mnt
Como o cd
acontece em um sub-shell, ele não afetará o ambiente fora dele, e o diretório atual no momento do umount
estará onde você estava quando executou o script.
Esta é uma construção de shell muito comum, ou seja, para fazer
( cd dir && somecommand )
É muito mais limpo (e mais claro) do que tentar cd
em algum lugar e depois voltar novamente, especialmente ao ter que entrar em vários diretórios durante o curso de um script.
Com o &&
também significa que o comando não será executado se o cd
falhar por algum motivo. Em seu script, se o mount
falhasse, você ainda criaria um tar
archive de um diretório vazio (?), Por exemplo, que pode não ser o que você deseja.
Uma variante mais curta que faz uso do sinal -C
de tar
:
sudo mount -o loop Sample.iso /tmp/mnt
tar -cvf /tmp/sample.tar -C /tmp/mnt .
sudo umount /tmp/mnt
Isso faz com que tar
faça o cd
internamente antes de adicionar o diretório atual ( /tmp/mnt
) ao arquivo. Observe, porém, que isso tem o efeito de que arquivos ou pastas ocultos também serão adicionados ao arquivo.