Как я могу сказать (в ~/.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, это не удастся, если не интерактивные сеансы имеют вывод