LINUX.ORG.RU

zsh виноват?


0

1

Есть у меня скриптик, который проверяет смонтирована ли флэшка, если да, то размонтирует и перезагружает комп или выключает его. Если размонтирована, делает то же самое без umount. Скриптик с использованием case, а внутри if. Привожу маленький кусочек: ................................ ;; h) DIR=/mnt/disk/ if [[ -d $DIR && `ls -A $DIR` ]] ............................. Теперь суть проблемы. Если оболочка zsh, то с параметром r) (reboot - в примере не показан) проблем нет, а вот с параметром h (poweroff) скрипт не запускается. Самое странное, если заменяю h на s, скрипт работает.Я не пробовал, возможно и другие буквы тоже работают. В bash'e проблема исчезает. Есть ли этому какое-то объяснение? Заодно скажите, как сделать, чтобы многострочный пример не выглядел в отправленном виде в одну строку, а был похож на скрипт?



Последнее исправление: wlad_o (всего исправлений: 1)

Есть у меня скриптик, который проверяет смонтирована ли флэшка, если да, то размонтирует и перезагружает комп или выключает его. Если размонтирована, делает то же самое без umount.

А есть ли смысл размонтировать флешку, если всё равно перезагружаешь комп?

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

А есть ли смысл размонтировать флешку, если всё равно перезагружаешь комп?

Абсолютно точный ответ на этот вопрос я дать не берусь.

wlad_o
() автор топика
Ответ на: комментарий от wlad_o

ужс, нельзя чтоли воспользоваться функциями?

Deleted
()
Ответ на: комментарий от Valdor

Естественно, нет.

Дело не в этом, даже если нет смысла. Меня интересует, почему не работает скрипт?

wlad_o
() автор топика
Ответ на: комментарий от ziemin

Ты пролистал бы до секции code штоли.

Я тут человек совсем новый, еще не разобрался, а портить сообщение не хочу, потом соображу что к чему:).

wlad_o
() автор топика
Ответ на: комментарий от wlad_o

В этом скрипте у меня всё в zsh работает, кроме того, что ругается на ошибки синтаксиса. Ошибки синтаксиса я исправил так. Вместо:

if  [[ -d $DIR  && `ls -A $DIR` ]]
Писал:
if  [[ -d $DIR ]] && ls -A $DIR &>/dev/null
Ну и ещё в одной строчке незаконченное '...'.

После этого у меня всё работало, кроме того, что я пароль в sudo не вводил, мне лень реально перезагружать.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

Ну и ещё в одной строчке незаконченное '...'.

Не нашел. Хотя долго искал...

После этого у меня всё работало, кроме того, что я пароль в sudo не вводил, мне лень реально перезагружать.

Не понял. Пароль и не надо вводить, для этого sudo и стоит. Хотя это от настроек sudoers зависит.

Вообще, спасибо, учту вот это: &>/dev/null. А вот то, что «&& ls -A $DIR» у Вас не входит в test, мне непонятно. Смысл строки у меня в том, что проверяется наличие директории, где монтируется флэшка и наличие вывода команды ls. А в Вашем варианте, проверяется только наличие директории. Далее независимо от ее содержания идет umount. А мне нужно, чтобы umount выполнялся только в случае наличия вывода ls.У Вас скрипт сработал, но размонтировалась пустая директория.
Попробую сейчас изменить скрипт и выключить комп,а завтра сообщу результат. (Хотя давно подмывает вернуться на bash, мне не лень в некоторых случаях лишний раз нажать на клаву).
Следующее, главное (!) Вы заметили, что куски кода (кроме echo) в параметре r и в параметре h одинаковы? Тогда почему первый кусок с буквой r выполняется, а второй с буквой h нет?
Спасибо за конструктивный ответ, а то все ногами, ногами...

wlad_o
() автор топика
Ответ на: комментарий от wlad_o

Смысл строки у меня в том, что проверяется наличие директории, где монтируется флэшка и наличие вывода команды ls

Ах, да. Как-то я не подумал. Тогда можно попробовать так:

if  [[ -d $DIR && -n "$(ls -A $DIR 2>/dev/null)"]]

Вообще, спасибо, учту вот это: &>/dev/null

Не уверен, что это не zsh-изм.

Не нашел. Хотя долго искал...
Вы заметили, что куски кода (кроме echo) в параметре r и в параметре h одинаковы?

А мы один и тот же код запускаем? Я запускаю тот, который на pastebin. Незакрытые одинарные кавычки вот в этой строке:

echo 'Обошлось без umount:); sleep 2
Кроме того, вот в этой строчке неэкранированный восклицательный знак:
echo Отмонтировались. Ребутимся!; sleep 1
Так вот, у меня всё работает. То есть и r, и h, никакой разницы.

proud_anon ★★★★★
()
Ответ на: комментарий от proud_anon

А мы один и тот же код запускаем?

Наверно, грешен я, второпях на pastebin убрал из echo кое-что чисто личное и, видимо, зацепил где-то кавычку. Но что-то в zsh у меня какие-то нелады. Появились еще проблемы с монтированием. Перешел на bash и все хорошо. Похоже проблемы с чисто моим zsh. Еще раз спасибо!

anonymous
()
Ответ на: комментарий от proud_anon

За сутки пришел к выводу, что скриптик мой безупречен, поэтому ничего трогать не буду. Ковырять мне надо настройки zsh, тем более, что с ним иногда не запускаются некоторые программы, не монтируется флэшка, ну и фокусы со скриптом запишу в его заслугу. Если получится что-то, достойное сообщения - отпишу сюда. Всем спасибо!

wlad_o
() автор топика
Ответ на: комментарий от wlad_o

Нашел одну штуку. Был один алиас «h» в алиасах zsh, после его закомментирования скрипт стал запускаться с параметром «h». Теперь есть следующий вопрос. У меня в скрипте задана переменная
DIR=/mnt/disk/.
А как правильно задать несколько директорий, чтобы все они были переменной $DIR. Например, у меня может быть не только ручное монтирование в /mnt/disk/, но и автоматическое в /media.
Значит, размонтировать надо обе директории.

wlad_o
() автор топика

оужас

man mount, ищи описание /etc/mtab и /proc/mounts

#!/bin/bash
dirs=(/mnt/data /media)

case "$1" in
 r) cmd=reboot;;
 h) cmd=poweroff;;
 *) echo "Usage: $0 {r|h}" >&2; exit 1;;
esac

IFS=$'\n'
cut -d ' ' -f 2 /etc/mtab | grep -xF "${dirs[*]}" | xargs umount || exit $?
$cmd

Можно ещё по устройству отслеживать, типа такого:

devs=(/dev/sdb1 /dev/sdc1)
...
cut -d ' ' -f 1 /etc/mtab | grep -xF "${devs[*]}" | xargs umount || exit $?

У этого кода будут проблемы если в директориях или названиях устройств есть пробелы. Если это критично, то надо разобраться в каком формате это всё записывается в /etc/mtab и заменить cut на что-то подходящее.

И да, правильнее весь скрипт запускать с sudo, а не вписывать его внутрь.

Jini ★★
()
Ответ на: комментарий от Jini

Спасибо, попробую разобраться. А вот по устройству нельзя, при монтировании флэшки устройство меняется от раза к разу, поэтому в fstab не прописываю.

wlad_o
() автор топика
Ответ на: комментарий от ubuntuawp

убери этот доллар

Убрал, ничего не изменилось.

wlad_o
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.