Вопрос по bash (/dev/sda1 примонтировано или нет?..)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
Гарыныч
Сообщения: 202
ОС: Gentoo

Вопрос по bash

Сообщение Гарыныч »

Доброго времени суток всем.
Хочу написать скрипт для кнопки - нажал - /dev/sda1 примонтировалось, еще раз нажал - отмонтировалось.
Для определения "а примонтировано ли?" делал так:

Код: Выделить всё

mount | grep /dev/sda1 > /dev/null
if [ "$?" == "1" ]; then
...
else
...
fi

Но это почему-то не всегда работает, я так и не понял когда и почему переменная $? принимает значения 0 и 1. Как я понял, если текст есть - единица, текста нет - 0?
Почему-то это не так... :blink:
Вот часть /etc/fstab, в которой описана флэшка (любой юзер может ее монтировать):

Код: Выделить всё

/dev/sda1 /mnt/flash  vfat pamconsole,exec,noauto,fscontext=system_u:object_r:removable_t,managed,iocharset=utf8 0 0

Поможите кто чем может :)
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Вопрос по bash

Сообщение t.t »

http://www.linuxforum.ru/index.php?showtopic=9152
Первый пост, и далее дополнение от sash-kan.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Гарыныч
Сообщения: 202
ОС: Gentoo

Re: Вопрос по bash

Сообщение Гарыныч »

Код: Выделить всё

#!/bin/bash
grep -q sda1 /etc/mtab && umount /dev/sda1 ||
mount /dev/sda1 &>/dev/null || umount /dev/sda1

Можно немного пояснений?..

То есть, мне интересно КАК это работает :)
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Вопрос по bash

Сообщение madskull »

Гарыныч писал(а):
23.12.2005 22:48

Код: Выделить всё

#!/bin/bash
grep -q sda1 /etc/mtab && umount /dev/sda1 ||
mount /dev/sda1 &>/dev/null || umount /dev/sda1

Можно немного пояснений?..

То есть, мне интересно КАК это работает :)

Так там же написано, как. А уж подробнее - к соответствующим манам.

А по поводу первого поста: надо проверять на неравенство НУЛЮ. Т.е. если ноль, то все в порядке, если не ноль - ошибка.
Как я понял, если текст есть - единица, текста нет - 0?

Нет, текст может быть независимо от результата. Если $? (код возврата) равен нулю - то все в порядке. Если не равен - можно анализировать его (код возврата) для определения ошибки.
Т.е.

Код: Выделить всё

mount | grep /dev/sda1 > /dev/null
if [ $? -eq 0 ]; then
  echo Ok
else
  echo Error
fi


Конкретно с grep можно сделать так

Код: Выделить всё

mount | grep -q /dev/sda1 && eject /dev/sda1
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
router
Сообщения: 363
ОС: Debian, на работе rhel

Re: Вопрос по bash

Сообщение router »

Гарыныч писал(а):
23.12.2005 22:48
То есть, мне интересно КАК это работает :)

Лучший учебник по bash - http://gazette.linux.ru.net/rus/articles/abs-guide/ ИМХО, разумеется :)
Спасибо сказали:
Аватара пользователя
Гарыныч
Сообщения: 202
ОС: Gentoo

Re: Вопрос по bash

Сообщение Гарыныч »

:wacko:
Сам программер... Но с баш сталкиваюсь второй раз и очень мало пока понимаю :)

router писал(а):
23.12.2005 23:20
Гарыныч писал(а):
23.12.2005 22:48

То есть, мне интересно КАК это работает :)

Лучший учебник по bash - http://gazette.linux.ru.net/rus/articles/abs-guide/ ИМХО, разумеется :)

Знаю-знаю, он у меня в закладках есть :)

То есть со всякими операторами, переменными со всякой такой лабудой проблем нет. Проблемы с программированием на bash в linux :)
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Вопрос по bash

Сообщение v04bvs »

Гарыныч писал(а):
23.12.2005 22:48

Код: Выделить всё

#!/bin/bash
grep -q sda1 /etc/mtab && umount /dev/sda1 ||
mount /dev/sda1 &>/dev/null || umount /dev/sda1

Можно немного пояснений?..

То есть, мне интересно КАК это работает :)

Если команда grep -q sda1 /etc/mtab возвращает код завершения 0, т.е. в файле /etc/mtab найдена строчка sda1, то выполняется команда umount /dev/sda1 иначе идёт попытка примонтировать /dev/sda1, и если она закончилась неудачей, то опять отмонтируется /dev/sda1. Последнее действие не нужно, если mount завершилось ошибкой, значит ничего не примонтировано.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Вопрос по bash

Сообщение sash-kan »

(v04bvs @ Dec 24 2005, в 11:11) писал(а):если mount завершилось ошибкой, значит ничего не примонтировано

а не наоборот? (:
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Вопрос по bash

Сообщение v04bvs »

а не наоборот? (:


Код: Выделить всё

% 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
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Вопрос по bash

Сообщение nercus »

Вообще, имхо достаточно просто 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 | ДДТ
Спасибо сказали:
Аватара пользователя
flook
Сообщения: 585
Статус: Просто flook

Re: Вопрос по bash

Сообщение flook »

Скажите, знающие люди, а bash-script это единственный язык у которого if/while/... работают "черезжэ", то есть 0 - это true, а не 0 - это false?
В каждом из нас спит гений... и с каждым днем все крепче...
Спасибо сказали:
Аватара пользователя
router
Сообщения: 363
ОС: Debian, на работе rhel

Re: Вопрос по bash

Сообщение router »

flook писал(а):
24.12.2005 17:38
Скажите, знающие люди, а bash-script это единственный язык у которого if/while/... работают "черезжэ", то есть 0 - это true, а не 0 - это false?

"черезже" было бы, если бы программы возвращали 0 в случае ошибки, а так - всё логично ;)
Спасибо сказали:
Аватара пользователя
agent-mega
Сообщения: 505
Статус: Автономный модуль

Re: Вопрос по bash

Сообщение agent-mega »

flook писал(а):
24.12.2005 17:38
Скажите, знающие люди, а bash-script это единственный язык у которого if/while/... работают "черезжэ", то есть 0 - это true, а не 0 - это false?

Да тут дело не в true и false, if и while. Просто общепринято, что код выхода программы при её успешном завершении - 0, а при других завершениях - другие числа. Что есть успешное завершение и что есть другие типы завершений вместе с их кодами можно почерпнуть из соотв. манов к этим программам.
Конструкция 'if <команда> then...' расшифровывается как "если <команда> завершилась успешно, т.е. с кодом '0', то...". Также, для удобства код выхода последней отработавшей проги записывается в переменную '$?'.
Поправьте меня, если я не прав.
DEBIAN & DEBIAN-BASED ONLY

Всё относительно. Объективности не существует.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Вопрос по bash

Сообщение t.t »

(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, причём вместо всего изначального скрипта. :)
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Вопрос по bash

Сообщение nercus »

t.t писал(а):
24.12.2005 20:17
(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.

А про "зачем" - согласен, тоже не очень понимаю;)

На всякий случай... я про вот этот кусок:

Код: Выделить всё

#!/bin/bash
grep -q sda1 /etc/mtab && umount /dev/sda1 ||
mount /dev/sda1 &>/dev/null || umount /dev/sda1
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Вопрос по bash

Сообщение t.t »

(nercus @ Dec 24 2005, в 20:38) писал(а):Ну как же. Изначальная задача
А.. :) Про изначальную задачу я как-то за всеми этими дебатами забыл, знаете.. :)

А классная штука оптимизация :) Спасибо, я уже забыл как-то. Выходит, в моём скрипте (в теме по ссылке) первая строчка не нужна.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
nercus
Сообщения: 150

Re: Вопрос по bash

Сообщение nercus »

Кстати, если вместо umount делать eject, то довольно полезная штука;)
2.6.14-gentoo-r5
kde-3.5.0 | openbox-3.2
Deep Purple | Rob Zombie | Led Zeppelin | ДДТ
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Вопрос по bash

Сообщение t.t »

(nercus @ Dec 24 2005, в 21:15) писал(а):Кстати, если вместо umount делать eject, то довольно полезная штука
Ну да, потому ведь и придумывалось :)
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Гарыныч
Сообщения: 202
ОС: Gentoo

Re: Вопрос по bash

Сообщение Гарыныч »

t.t, nercus :)
Кинул на панель XFCE кнопку запуска этого скрипта. То есть чтобы примонтировать-отмонтировать, скажем, флэшку, мне надоело писать все ручками. Один раз сделано - и хватит ;)
Спасибо сказали: