Jump to content
Калькуляторы

Как проверить интерактивность терминала (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
...

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

Share this post


Link to post
Share on other sites

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

 

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

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

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

 

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

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

yamusic.zip

Share this post


Link to post
Share on other sites

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

......
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
.....

 

Share this post


Link to post
Share on other sites

Неплохо.

В 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-у?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now