Bash Script - размонтировать устройство, но не подвести, если оно не смонтировано?

Я пишу сценарий Bash и у меня есть errexit установить, так что сценарий умрет, если какая-либо команда не вернет код выхода 0, т.е. если какая-либо команда не завершится успешно. Это сделано для того, чтобы мой скрипт bash был надежным.

Я должен смонтировать некоторые файловые системы, скопировать некоторые файлы, размонтировать его. Я кладу umount /mnt/temp с самого начала, чтобы он перед этим ничего не делал. Однако, если он не смонтирован, то umount потерпит неудачу и остановит мой скрипт.

Можно ли сделать umount --dont-fail-if-not-mounted /mnt/temp? Так что он вернет 0, если устройство не смонтировано? подобно rm -f?

4 ответа

Решение

Стандартный прием игнорирования кода возврата состоит в том, чтобы обернуть команду в логическое выражение, которое всегда приводит к успеху:

umount .... || /bin/true

Игнорирование кодов выхода небезопасно, так как не будет различать то, что уже размонтировано, и невозможность размонтировать подключенный ресурс.

Я бы рекомендовал проверить, что путь смонтирован с помощью mountpoint который возвращает 0 тогда и только тогда, когда указанный путь является смонтированным ресурсом.

Этот сценарий завершится с 0, если указанный путь не был смонтирован, в противном случае он выдаст код выхода из umount.

      #!/bin/sh

if mountpoint -q "$1"; then
  umount "$1"
fi

Вы также можете сделать это как один лайнер.

      ! mountpoint -q "$mymount" || umount "$mymount"

Предполагая, что ваш umount возвращает 1, когда устройство не подключено, вы можете сделать это так:

umount … || [ $? -eq 1 ]

Тогда bash не примет ошибку, если umount возвращает 0 или 1 (т. е. успешно отключается или устройство не подключено), но останавливает сценарий, если возвращается какой-либо другой код (например, у вас нет прав на отключение устройства).

Я просто нашел ":" более полезным и хотел найти подобное решение, но пусть сценарий знает, что происходит.

umount ...... || { echo "umount failed but not to worry" ; : ; } 

Это возвращает true с сообщением, хотя размонтирование не удалось.

Другие вопросы по тегам