Как я могу сказать (in ~/.bashrc
), работаю ли я в интерактивном режиме или, скажем, выполняю команду через ssh. Я хочу избежать печати escape-последовательностей ANSI, .bashrc
если это последнее.
Как я могу сказать (in ~/.bashrc
), работаю ли я в интерактивном режиме или, скажем, выполняю команду через ssh. Я хочу избежать печати escape-последовательностей 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
например.
В любом случае, по-прежнему рекомендуется проверять интерактивность, поскольку может существовать неправильная конфигурация.
[[ $- =~ i ]] && echo interactive
i
~/.bash_profile
или ~/.profile
неверны, поскольку это мешает ожидаемому поведению . Что вы думаете о поиске ~/.bashrc
из ~/.bash_login
? Поскольку оболочка входа не должна быть интерактивной, я думаю, что это тоже неправильно.
Использование:
if tty -s; then echo interactive; fi
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
bash <<< 'test -t 0 && echo Y || echo X'
пишет Y
, bash -c 'test -t 0 && echo Y || echo X'
пишетX
Я обычно смотрю на вывод программы tty.
Если вы находитесь на tty, он скажет вам, на каком tty вы находитесь. Если вы не в интерактивном режиме, он обычно говорит вам что-то вроде «не tty».
Вот как это делает красная шляпа ... Угадай, это самый быстрый способ ...
if [ "$-#*i" == "$-" ]; then
Это означает получить параметры bash, удалить подстроку, максимально короткий, сопоставить все между началом и i. Затем проверьте, совпадают ли они с исходными параметрами bash.
Проверьте, выполнили ли вы свою работу, подключившись к пользователю с помощью sftp, произойдет сбой, если выводятся неинтерактивные сеансы