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