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

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

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

решение1

В соответствии с man bash:

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

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

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

Также:

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

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

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

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

решение2

инструмент 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

решение3

Использовать:

if tty -s; then echo interactive; fi

решение4

Вот как это делает Red Hat... Думаю, это самый быстрый способ...

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

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

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

Связанный контент