Доброго времени суток всем.
Хочу написать скрипт для кнопки - нажал - /dev/sda1 примонтировалось, еще раз нажал - отмонтировалось.
Для определения "а примонтировано ли?" делал так:
mount | grep /dev/sda1 > /dev/null
if [ "$?" == "1" ]; then
...
else
...
fi
Но это почему-то не всегда работает, я так и не понял когда и почему переменная $? принимает значения 0 и 1. Как я понял, если текст есть - единица, текста нет - 0?
Почему-то это не так...
Вот часть /etc/fstab, в которой описана флэшка (любой юзер может ее монтировать):
Так там же написано, как. А уж подробнее - к соответствующим манам.
А по поводу первого поста: надо проверять на неравенство НУЛЮ. Т.е. если ноль, то все в порядке, если не ноль - ошибка.
Как я понял, если текст есть - единица, текста нет - 0?
Нет, текст может быть независимо от результата. Если $? (код возврата) равен нулю - то все в порядке. Если не равен - можно анализировать его (код возврата) для определения ошибки.
Т.е.
Если команда grep -q sda1 /etc/mtab возвращает код завершения 0, т.е. в файле /etc/mtab найдена строчка sda1, то выполняется команда umount /dev/sda1 иначе идёт попытка примонтировать /dev/sda1, и если она закончилась неудачей, то опять отмонтируется /dev/sda1. Последнее действие не нужно, если mount завершилось ошибкой, значит ничего не примонтировано.
% mount
/dev/hda2 on / type ext3 (rw,errors=remount-ro)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/hda3 on /home type ext3 (rw)
/dev/hdc1 on /mnt/data type ext3 (rw)
usbfs on /proc/bus/usb type usbfs (rw)
tmpfs on /dev type tmpfs (rw,size=10M,mode=0755)
% mount /dev/sda1
mount: I could not determine the filesystem type, and none was specified
% mount
/dev/hda2 on / type ext3 (rw,errors=remount-ro)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/hda3 on /home type ext3 (rw)
/dev/hdc1 on /mnt/data type ext3 (rw)
usbfs on /proc/bus/usb type usbfs (rw)
tmpfs on /dev type tmpfs (rw,size=10M,mode=0755)
%
Ничего не добавилось, соответственно отмонтировать /dev/sda1 не нужно.
Если имелось ввиду то, что /dev/device уже примонтирован куда надо, то это должно было отразиться в grep device /etc/mtab
Вообще, имхо достаточно просто mount <mntpt> &>/dev/null || umount <mntpt> &>/dev/null
Зачем нужен grep, я так и не понял. То есть, не понял, чем вариант с grep'ом лучше.
2v04bvs: umount нужен, когда mount не срабатывает - а mount не срабатывает, если а) не возможно примонтировать и б) уже примонтировано. В случае а) umount тоже обломится. В случае б) - это именно то, что и требуется.
2.6.14-gentoo-r5 kde-3.5.0 | openbox-3.2 Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Скажите, знающие люди, а bash-script это единственный язык у которого if/while/... работают "черезжэ", то есть 0 - это true, а не 0 - это false?
Да тут дело не в true и false, if и while. Просто общепринято, что код выхода программы при её успешном завершении - 0, а при других завершениях - другие числа. Что есть успешное завершение и что есть другие типы завершений вместе с их кодами можно почерпнуть из соотв. манов к этим программам.
Конструкция 'if <команда> then...' расшифровывается как "если <команда> завершилась успешно, т.е. с кодом '0', то...". Также, для удобства код выхода последней отработавшей проги записывается в переменную '$?'.
Поправьте меня, если я не прав.
(nercus @ Dec 24 2005, в 16:11) писал(а):Вообще, имхо достаточно просто mount <mntpt> &>/dev/null || umount <mntpt> &>/dev/null
Зачем нужен grep, я так и не понял. То есть, не понял, чем вариант с grep'ом лучше.
Если говорить про тот скрипт, с которого началось обсуждение, то я вообще не очень понял зачем он такой нужен. А если именно про кусок "grep -q sda1 /etc/mtab && umount /dev/sda1", то тогда я скорее не понимаю зачем тут mount, если достаточно grep -- зачем пытаться примонтировать, если нужно всего лишь проверить, не примонтировано ли?
Хм.. Хотя вообще-то достаточно просто umount <mntpt> &>/dev/null, причём вместо всего изначального скрипта.
(nercus @ Dec 24 2005, в 16:11) писал(а):Вообще, имхо достаточно просто mount <mntpt> &>/dev/null || umount <mntpt> &>/dev/null
Зачем нужен grep, я так и не понял. То есть, не понял, чем вариант с grep'ом лучше.
Если говорить про тот скрипт, с которого началось обсуждение, то я вообще не очень понял зачем он такой нужен. А если именно про кусок "grep -q sda1 /etc/mtab && umount /dev/sda1", то тогда я скорее не понимаю зачем тут mount, если достаточно grep -- зачем пытаться примонтировать, если нужно всего лишь проверить, не примонтировано ли?
Хм.. Хотя вообще-то достаточно просто umount <mntpt> &>/dev/null, причём вместо всего изначального скрипта.
Ну как же. Изначальная задача - один и тот же скрипт и монтирует, и отмонтирует. Следовательно, как минимум 1 mount и 1 umount в скрипте должны присутствовать. Строка mount || unmount - минимальное решение. В случае с грепом, греп нужен только чтобы определить, подмонтировано ли устройство, или нет. Но с этой задачей превосходно справляется и сам mount - если устройство не подмонтировано, то он его сразу монтирует. Если уже подмонтировано, то вернет !0 и перейдет на umount.
t.t, nercus
Кинул на панель XFCE кнопку запуска этого скрипта. То есть чтобы примонтировать-отмонтировать, скажем, флэшку, мне надоело писать все ручками. Один раз сделано - и хватит