Перейти к содержимому
Калькуляторы

Как проверить интерактивность терминала (linux, bash)?

Есть скрипт, который долго выполняется в цикле.

На каждой итерации он ждет 5 минут, нажатием любой кнопки ожидание можно прекратить.

Чтобы к нему можно было подключиться с любого места, он запускается внутри screen.

Как можно проверить в скрипте, имеется ли рабочий интерактивный стандартный ввод?

Я сделал так:

...
	if [ -t 0 -a -e /dev/tty ]; then
		read -t 300 -p "Wait 5 min or any key..." -s -n 1 < /dev/tty
	else
		echo "Wait 5 min..."
		/usr/bin/sleep 300
	fi
...

Но так почему-то не работает, он всегда работает по второму варианту.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть команда tty она выводит имя терминала и устанавливает код возврата 0 если скрипт запущен с терминала

 

igor@d7480:~$ tty; echo $?
/dev/pts/0
0
igor@d7480:~$ echo | tty; echo $?
не телетайп
1

у нее есть опция -s ничего не выводить, только устанавливать код возврата

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

tty -s && echo терминал || echo хз вроде нет

Но мне кажется когда скрипт запущен через screen, там всегда будет терминал, даже когда к screen никто не подключён. Вам это надо проверять?

Не будет терминала только если запущен из crontab, например.

Может кстати лучше так и сделать, чтобы скрипт запускался раз в 5 минут из крона?

И добавить проверку на работу предыдущей копии и выход, если какой-то из запусков занял дольше пяти минут.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

42 минуты назад, rm_ сказал:

Но мне кажется когда скрипт запущен через screen, там всегда будет терминал, даже когда к screen никто не подключён.

Ну как бы да, в этом и сложность — как узнать, что за терминалом есть действующая клавиатура.

В итоге проверку заменил на [ -e /dev/tty ] (убрал проверку, что stdin открыт на tty); если к screen никто не подключен, значит просто нажатия кнопок не будет.

 

Прикладываю итоговый скрипт, вдруг кому пригодится.

Качалка с Яндекс.Музыки, точнее вспомогательная оболочка к качалке.

yamusic.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот фрагмент скрипта, который если запущен не в интерактивном режиме валит свой выхлоп в файл лога, мож Вам поможет :

......
if [[ -z "$TERM" ]] || [[ "$TERM" = "dumb" ]] ; then
 set -vx
 exec 3>&1 4>&2
 exec 1>$r0/${me}_${ymdhm}.debug 2>&1
else
 set -vx
fi
.....

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Неплохо.

В screen не пригодится, а вообще нужно будет запомнить.

 

Есть какие-то странности с кавычками.

Такой фрагмент скрипта:

CMD="/bin/python3.9 ./yamusic.py"
[ -n "$SESSION" ] && CMD="$CMD --session-id \"$SESSION\""
[ -n "$DIR"     ] && CMD="$CMD --dir $DIR"
[ -n "$PATH"    ] && CMD="$CMD --path-pattern \"$PATH\""
[ -n "$UA"      ] && CMD="$CMD --user-agent \"$UA\""
[ -n "$LOOP"    ] && CMD="$CMD $LOOP"
[ -n "$OPTS"    ] && CMD="$CMD $OPTS"
[ -n "$DEBUG"   ] && CMD="$CMD --log-level ${DEBUG^^}"
[ -n "$DST"     ] && CMD="$CMD $DST"

echo $CMD
$CMD
RC=$?

Смысл в том, чтобы сформировать команду запуска в зависимости от параметров.

 

Однако этот фрагмент приводит к ошибке в вызываемом скрипте:

/bin/python3.9 ./yamusic.py --session-id "..." --dir /MUSIC --path-pattern "#album-artist - #title" --delay 5 --hq --embed-cover --skip-existing --playlist-id user/3

usage: yamusic.py [-h] [--hq] [--skip-existing] [--add-lyrics] [--embed-cover] [--stick-to-artist] [--cover-resolution <Разрешение обложки>] [--delay <Задержка>]
                  [--log-level {CRITICAL,FATAL,ERROR,WARN,WARNING,INFO,DEBUG,NOTSET,VERBOSE}]
                  (--artist-id <ID исполнителя> | --album-id <ID альбома> | --track-id <ID трека> | --playlist-id <владелец плейлиста>/<тип плейлиста> | -u URL) [--unsafe-path] [--dir <Папка>] [--path-pattern <Паттерн>]
                  --session-id <ID сессии> [--user-agent <User-Agent>]
yamusic.py: error: unrecognized arguments: - #title"

То есть ему чем-то не нравится аргумент --path-pattern.

Однако если первую строку вывода скопировать и вставить, то она срабатывает нормально.

Такое впечатление, что кавычки, вводимые интерактивно, обрабатываются как-то по особенному.

А вот если их добавлять в строку в скрипте, то с ними что-то не то.

Нет идей, что тут не нравится bash-у?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.