Назад | Перейти на главную страницу

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

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

В соответствии с 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 например.

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

в 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

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

if tty -s; then echo interactive; fi

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

Если вы подключены к терминалу, он сообщит вам, на каком терминале вы находитесь. Если вы не находитесь в интерактивном режиме, он обычно сообщает вам что-то вроде «not a tty».

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

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

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

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