Подскажите настройку: как определить, когда нет 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

Другие вопросы по тегам