Здравствуйте.
Хочу написать скрипт, который при включении 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'ом я не вижу в консоли ничего.
Вопросы:
Как отловить вышеупомянутый еггог? Может есть возможность отловить код завершения программы?
А может быть есть более элегантный способ определить доступность устройства?
Прошу помощи в написании скрипта.
Модераторы: /dev/random, Модераторы разделов
-
- Сообщения: 355
- ОС: Gentoo
Re: Прошу помощи в написании скрипта.
Я никогда не видел 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
-
- Сообщения: 152
- ОС: Fedora
Re: Прошу помощи в написании скрипта.
Да. И ведь я уже наступал на эти грабли однажды.
Да, это работает, спасибо. Но как это работает? if сам разруливает код завершения?
UPD.
Это работает, но, наверное, нужно "спрятать" вывод hcitool. А если я делаю 1>/dev/null 2>/dev/null , то это уже не работает, в любом случае говорит что телефона нет. Можно обойти это?
Но это я из любопытства спрашиваю. Через отлов $? работает по всякому.
-
- Модератор
- Сообщения: 4823
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: Прошу помощи в написании скрипта.
возможно так будет работать без лишних выводов:
[[ $(hcitool info $MAC) ]] && (# Телефон найден) || (# Телефон не найден)
[[ $(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.
The more you believe you don't do mistakes, the more bugs are in your code.
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Прошу помощи в написании скрипта.
Ужас какой. (: Чем Вам pgrep не угодил?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
- Сообщения: 355
- ОС: Gentoo
-
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Прошу помощи в написании скрипта.
(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нεиж
-
- Сообщения: 355
- ОС: Gentoo
Re: Прошу помощи в написании скрипта.
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.