Прошу помощи в написании скрипта.

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

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

uscr
Сообщения: 152
ОС: Fedora

Прошу помощи в написании скрипта.

Сообщение uscr »

Здравствуйте.
Хочу написать скрипт, который при включении bluetooth на ноутбуке будет ждать появления телефона с включённым bluetooth, выполнять сопряжение и создавать интернет соединение. Ожидание решил с помошья while и sleep, сопряч и создать соединение тоже не проблема. Не могу определить наличие телефона. Решил делать это с помощью hcitool info <MAC>. В случае если телефона рядом нет, hcitool вываливает в консоль Input\output error. Вот этот eггог я и не могу поймать.

Пробовал перенапрявлять вывод "тупо" в файл (hcitool info MAC > /tmp/example), файл пустой.
Пробовал присваивать результат выполнения переменной (temp=`hcitool info <MAC>`), переменная пустая.
Пробовал использовать перенаправление с помощью exec в файл. В файле отметились только контрольные echo.

Интересные подробности:
hcitool при работе пишет в консоль сначала - scanning in process (может быть и по другому, сейчас проверить нет возможности)
через время выводит, собственно результат. Так вот при запуске скрипта из консоли, если я перенаправляю вывод hcitool в файл или пытаюсь присвоить результат переменной, то первого сообщения (про то, что scanning in process) я не вижу, а результат вываливается именно в консоль. При перенаправлении exec'ом я не вижу в консоли ничего.

Вопросы:
Как отловить вышеупомянутый еггог? Может есть возможность отловить код завершения программы?
А может быть есть более элегантный способ определить доступность устройства?
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Прошу помощи в написании скрипта.

Сообщение ZyX »

Я никогда не видел hcitool, но по описанному поведению могу предположить, что оно вываливает ошибки в stderr. В качестве одного из способов обойти проблему могу посоветовать писать 2>&1 после каждого вызова hcitool — это перенаправит stderr в stdout, который вы, собственно, и ловите по умолчанию. Чтобы в будущем легко различать, куда пишет программа, установите hilite и добавьте в .bashrc что-то вроде следующего:

(Created by format.vim)

if ! ps T -o args= 2>/dev/null | grep -w "^[h]ilite" &>/dev/null then exec hilite zsh fi




Теперь относительно кода завершения: после выполнения программы он оказывается в $?, но обычно эта переменная не нужна. Попробуйте написать

(Created by format.vim)

if hcitool info $MAC ; then # Телефон найден else # Телефон не найден fi


Спасибо сказали:
uscr
Сообщения: 152
ОС: Fedora

Re: Прошу помощи в написании скрипта.

Сообщение uscr »

ZyX писал(а):
24.01.2011 21:38
Я никогда не видел hcitool, но по описанному поведению могу предположить, что оно вываливает ошибки в stderr.

Да. И ведь я уже наступал на эти грабли однажды.

ZyX писал(а):
24.01.2011 21:38
Теперь относительно кода завершения: после выполнения программы он оказывается в $?, но обычно эта переменная не нужна. Попробуйте написать

(Created by format.vim)

if hcitool info $MAC ; then # Телефон найден else # Телефон не найден fi


Да, это работает, спасибо. Но как это работает? if сам разруливает код завершения?

UPD.
Это работает, но, наверное, нужно "спрятать" вывод hcitool. А если я делаю 1>/dev/null 2>/dev/null , то это уже не работает, в любом случае говорит что телефона нет. Можно обойти это?
Но это я из любопытства спрашиваю. Через отлов $? работает по всякому.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: Прошу помощи в написании скрипта.

Сообщение SLEDopit »

возможно так будет работать без лишних выводов:
[[ $(hcitool info $MAC) ]] && (# Телефон найден) || (# Телефон не найден)
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.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Прошу помощи в написании скрипта.

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

ZyX писал(а):
24.01.2011 21:38
if ! ps T -o args= 2>/dev/null | grep -w "^[h]ilite" &>/dev/null
Ужас какой. (: Чем Вам pgrep не угодил?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Прошу помощи в написании скрипта.

Сообщение ZyX »

t.t писал(а):
25.01.2011 01:20
ZyX писал(а):
24.01.2011 21:38
if ! ps T -o args= 2>/dev/null | grep -w "^[h]ilite" &>/dev/null
Ужас какой. (: Чем Вам pgrep не угодил?

И как его использовать? pgrep -t $(tty) hilite не работает, хотя echo $(tty) выдаёт те же результаты, что и просто tty.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Прошу помощи в написании скрипта.

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

(man pgrep) писал(а):-s sid,...
Only match processes whose process session ID is listed. Session ID 0 is translated into pgrep’s or pkill’s own session ID.

-t term,...
Only match processes whose controlling terminal is listed. The terminal name should be specified without the "/dev/" prefix.

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

$ sleep 100 &
[1] 29864
$ pgrep -s0
11002
29864
$ pgrep -t $(tty | cut -d/ -f3-)
11002
29864
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Прошу помощи в написании скрипта.

Сообщение ZyX »

t.t писал(а):
25.01.2011 09:04
(man pgrep) писал(а):-s sid,...
Only match processes whose process session ID is listed. Session ID 0 is translated into pgrep’s or pkill’s own session ID.

-t term,...
Only match processes whose controlling terminal is listed. The terminal name should be specified without the "/dev/" prefix.

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

$ sleep 100 &
[1] 29864
$ pgrep -s0
11002
29864
$ pgrep -t $(tty | cut -d/ -f3-)
11002
29864


Спасибо. Ради интереса, проверил предположение, что в zsh уже определена переменная, содержащая имя терминала. Первая же попытка оказалась успешной: переменная $TTY содержит нужную информацию, поэтому вызов pgrep будет выглядеть так: pgrep -t ${TTY#/dev/} hilite.
Спасибо сказали: