Як я можу сказати (в ~/.bashrc
), якщо я працюю в інтерактивному режимі, або, скажімо, виконую команду над ssh. Я хочу уникнути друку послідовностей виходу ANSI, .bashrc
якщо це остання.
Як я можу сказати (в ~/.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-файлів.
Найкраще, якщо немає виводу для stdout з 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 ви працюєте. Якщо ви не перебуваєте в інтерактивному режимі, він зазвичай скаже вам щось на кшталт "not tty".