На самом деле это единственный раздел про unix на этом форуме
Модераторы: /dev/random , Модераторы разделов
sedikpoll
Сообщения: 100
Сообщение
sedikpoll » 17.05.2013 00:55
Есть сценарий который заканчивается следующим выражением:
т.е. я сортирую выражения и выбираю нужно если оно есть. Хочу прекрутить визуальное уведомление если такое выражение было найдено, сам код уведомления:
Мы знаем что если grep находит вхождения то его код завершения равен 0. Если я правильно понимаю логику то полностью выражение должно выглядить следующим образом:
Код: Выделить всё
...|sort|uniq -c|sort -n|grep -iE "3 abc"; if [ что то == 0 ] then xmessage -button ok -center 3 abc; fi
Но не совсем понимаю как именно нужно указать сам код возврата. Подскажите, пожалуйста, что именно в моем случаи нужно указывать в [ ].
Но так же у меня закрались подозрение что такое решение вообще верно т.к. код завершение будет для всего выражения сразу, а не для часто которая будет находится до if.
Bizdelnick
Модератор
Сообщения: 21479
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 17.05.2013 01:26
sedikpoll писал(а): ↑ 17.05.2013 00:55
что именно в моем случаи нужно указывать в [ ].
[ $? -eq 0 ]
А можно вместо ; if ... написать && xmessage ...
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
ormorph
Сообщения: 3214
ОС: Gentoo
Сообщение
ormorph » 18.05.2013 06:16
Так же можно вывод направить в переменную
а затем проверить пустая или нет.
if [ -n "$ABC" ] ; then xmessage -button ok -center 3 abc;fi
Либо в кавычках само выражение в место переменной, в $(...)
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL
Сообщение
SLEDopit » 18.05.2013 09:34
sedikpoll писал(а): ↑ 17.05.2013 00:55
т.к. код завершение будет для всего выражения сразу, а не для часто которая будет находится до if.
нет, там будет код завершения именно grep'а. даже если sort споткнётся, а grep вернёт 0, то !? будет 0.
Код: Выделить всё
$ echo 12 | cat - cat ; echo $?
12
cat: cat: No such file or directory
1
$ echo 12 | cat - cat | grep 1 ; echo $?
cat: cat: No such file or directory
12
0в bash для таких случае есть PIPESTATUS:
Код: Выделить всё
$ echo 12 | cat - cat | grep 1 ; echo ${PIPESTATUS[*]}
cat: cat: No such file or directory
12
0 1 0ну или можно включить pipefail, который выключен по умолчанию. Но оно тогда просто вернёт не 0, если кто-то в цепочке завалился. PIPESTATUS круче (:
зы. и, кстати, в данном случае, похоже, выхлоп от grep вас совершенно не интересует, поэтому его можно отключить опицей -q.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
ormorph
Сообщения: 3214
ОС: Gentoo
Сообщение
ormorph » 18.05.2013 11:01
Только похоже для PIPESTATUS нужно еще выполнять проверку наличия команд.