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