Як я можу перевірити баш, чи працює оболонка в інтерактивному режимі?


46

Як я можу сказати (в ~/.bashrc), якщо я працюю в інтерактивному режимі, або, скажімо, виконую команду над ssh. Я хочу уникнути друку послідовностей виходу ANSI, .bashrcякщо це остання.


Вибір того, друкувати або послідовності втечі, краще базуватися на значенні $ TERM, а не на інтерактивності оболонки. Змінна ідентифікує можливості клієнтського терміналу, яка є частиною, що інтерпретує послідовності виходу.
yrk

Відповіді:


53

Відповідно до man bash:

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

Таким чином, ви можете використовувати:

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

Також:

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

Таким чином, ~/.bashrcвикористовується лише для інтерактивних оболонок. Іноді люди отримують це джерело ~/.bash_profileабо ~/.profileє невірним, оскільки воно заважає очікуваній поведінці. Якщо ви хочете спростити технічне обслуговування коду, який є загальним, вам слід скористатися окремим файлом, який містить загальний код і джерело його незалежно від обох rc-файлів.

Найкраще, якщо немає виводу для stdout з 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".
yrk

не працює. чому люди висловлювали захист?
Сетоп

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

Гарний і, здається, переносний між оболонками. TEST це bash <<< 'test -t 0 && echo Y || echo X'пише Y, bash -c 'test -t 0 && echo Y || echo X'пишеX
kyb

1
це також підтверджує, що стандартний вхід TTY; Хоча це може бути пов'язано, але воно НЕ є таким же, як інтерактивний режим оболонки, який запитується та вказується прапором оболонки "-i".
yrk

6

Я зазвичай дивлюся на вихід програми tty.

Якщо ви знаходитесь на tty, він підкаже, на якому tty ви працюєте. Якщо ви не перебуваєте в інтерактивному режимі, він зазвичай скаже вам щось на кшталт "not tty".


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

Дякую! Минуло давно, як мені потрібно було робити подібні речі, і, мабуть, я забув деякі деталі ...
chris
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.