Как я могу проверить в bash, работает ли оболочка в интерактивном режиме?


46

Как я могу сказать (in ~/.bashrc), работаю ли я в интерактивном режиме или, скажем, выполняю команду через ssh. Я хочу избежать печати escape-последовательностей ANSI, .bashrcесли это последнее.


Выбор, печатать escape-последовательности или нет, лучше основывать на значении $ TERM, а не на интерактивности оболочки. Переменная определяет возможности клиентского терминала, который является частью, которая интерпретирует escape-последовательности.
yrk

Ответы:


53

По словам man bash:

PS1 установлен, а $ - включает i, если bash интерактивен, что позволяет сценарию оболочки или файлу запуска проверить это состояние.

Таким образом, вы можете использовать:

if [[ $- == *i* ]]
then
    do_interactive_stuff
fi

Также:

Когда запускается интерактивная оболочка, которая не является оболочкой входа в систему, bash читает и выполняет команды из /etc/bash.bashrc и ~ / .bashrc, если эти файлы существуют.

Так ~/.bashrcчто только для интерактивных оболочек. Иногда люди исходят из этого ~/.bash_profileили ~/.profileневерны, так как это мешает ожидаемому поведению. Если вы хотите упростить ведение общего кода, вам следует использовать отдельный файл, содержащий общий код и исходный код независимо от обоих файлов rc.

Лучше всего, если нет вывода на стандартный вывод из rcфайлов входа в систему, таких как ~/.bash_profileили, ~/.profileтак как это может помешать правильной работе, rsyncнапример.

В любом случае, по-прежнему рекомендуется проверять интерактивность, поскольку может существовать неправильная конфигурация.


7
Обратите внимание, что $ - может содержать i, не обязательно равное ему. Я использую[[ $- =~ i ]] && echo interactive
Алекс Ховански

1
@AlexHowansky: звездочки в тесте на равенство делают его тестом на сдерживаниеi
Деннис Уильямсон

Ух ты, даже не заметил, они выглядят как двойные кавычки на моем мониторе. Возможно, пришло время увеличить размер шрифта. <
старею

Иногда люди исходят из этого ~/.bash_profileили ~/.profileневерны, поскольку это мешает ожидаемому поведению . Что вы думаете о поиске ~/.bashrcиз ~/.bash_login? Поскольку оболочка входа не должна быть интерактивной, я думаю, что это тоже неправильно.
Петр Доброгост

1
@PiotrDobrogost: это отличное обсуждение файлов запуска оболочки.
Деннис Уильямсон

12

Использование:

if tty -s; then echo interactive; fi

Кажется, не работает
Стивен Шоу

мне кажется, это тоже не работает, я думаю, что это правильный ответ: stackoverflow.com/a/49064632/1223975
Александр Миллс

это проверяет наличие TTY на стандартном вводе; хотя это может быть связано, но это не то же самое, что интерактивный режим оболочки, на что указывает флаг оболочки "-i".
августа

не работает. почему люди проголосовали?
Setop

11

testинструмент может проверить это (со страницы человека):

 -t FD          True if FD is opened on a terminal.

Так что вы можете использовать, например:

 if [ -t 0 ] ; then
    echo stdin is a terminal
   .....
 fi

или же

if [ -t 1 ] ; then
    echo stdout is a terminal
 fi

Красиво и, кажется, переносимо между снарядами ТЕСТ это bash <<< 'test -t 0 && echo Y || echo X'пишет Y, bash -c 'test -t 0 && echo Y || echo X'пишетX
kyb

1
это также подтверждает, что стандартным вводом является TTY; хотя он может быть связан, но он НЕ совпадает с интерактивным режимом оболочки, который запрашивается и обозначается флагом оболочки «-i».
августа

6

Я обычно смотрю на вывод программы tty.

Если вы находитесь на tty, он скажет вам, на каком tty вы находитесь. Если вы не в интерактивном режиме, он обычно говорит вам что-то вроде «не tty».


3
tty -s установит возвращаемое значение 0, если вы находитесь на терминале, или 1 в противном случае, без вывода данных. Вы можете использовать его как 'if tty -s; тогда _интерактивный; Fi '
BillThor

Спасибо! Прошло много времени с тех пор, как мне нужно было делать подобные вещи, и я думаю, что забыл некоторые детали ...
Крис

0

Вот как это делает красная шляпа ... Угадай, это самый быстрый способ ...

if [ "$-#*i" == "$-" ]; then

Это означает получить параметры bash, удалить подстроку, максимально короткий, сопоставить все между началом и i. Затем проверьте, совпадают ли они с исходными параметрами bash.

Проверьте, выполнили ли вы свою работу, подключившись к пользователю с помощью sftp, произойдет сбой, если выводятся неинтерактивные сеансы

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.