Подскажите настройку: как определить, когда нет tty
У меня есть настраиваемое приглашение с цветами (с использованием tput), и каждый раз, когда я запускаю неинтерактивный сеанс на сервере, я получаю кучу ошибок.
Например, если я начну неинтерактивный сеанс, как это:
ssh root@hostname6 "echo 'hello' ; echo $TERM"
Я получаю вывод:
hello
xterm
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
stdin: is not a tty
Таким образом, переменная $TERM имеет значение, даже если сеанс не является интерактивным.
Какое условие я должен определить, чтобы при запуске неинтерактивной оболочки часть настройки приглашения не отображалась?
4 ответа
tput
Команды оцениваются во время назначения PS1. Поскольку файлы запуска обрабатываются при запуске сеанса ssh, назначение выполняется, даже если сеанс не является интерактивным. Вы можете проверить это и выполнить задание только тогда, когда вы фактически начинаете интерактивный сеанс.
if [[ $- =~ i ]]
then
# set PS1 using tput
else
# set a plain PS1 (or use hard-coded escape sequences)
fi
Там есть встроенный тест bash для TTY. Я забыл, когда он был добавлен, 3.0? Я считаю, что это относительно новый. Я использую его в скриптах, где мне нужно другое поведение, когда он запускается из cron или пользователь запускает его напрямую.
if [ -t 0 ]; then
echo "I'm a TTY"
fi
Поместите следующее в начало /etc/bashrc
[ -z "$PS1" ] && return
Вот описание всех 3 способов сделать это:
http://tldp.org/LDP/abs/html/intandnonint.html