Подтвердить что ты не робот

Проверьте isatty в bash

Я хочу, чтобы моя оболочка обнаруживала поведение человека, а затем показывала приглашение.

Итак, предположим, что имя файла - test.bash

#!/bin/bash
if [ "x" != "${PS1:-x}" ] ;then
 read -p "remove test.log Yes/No" x
 [ "$x" = "n" ] && exit 1
fi
rm -f test.log

Но, я нашел, что это не сработает, если я не установил PS1. Есть ли лучший способ?

мои методы тестирования:

./test.bash                  # human interactive
./test.bash > /tmp/test.log  # stdout in batch mode
ls | ./test.bash             # stdin in batch mode
4b9b3361

Ответ 1

чтобы разработать, я бы попробовал

 if [ -t 0 ] ; then
    # this shell has a std-input, so we're not in batch mode 
   .....
 else
    # we're in batch mode

    ....
 fi

Надеюсь, это поможет.

Ответ 2

От help test:

 -t FD          True if FD is opened on a terminal.

Ответ 3

Вы можете использовать программу /usr/bin/tty:

if tty -s
then
    # ...
fi

Я признаю, что я не уверен, насколько он переносим, ​​но это, по крайней мере, часть GNU coreutils.

Ответ 4

Обратите внимание, что нет необходимости использовать многомерные операторы оболочки && и || для объединения двух отдельных прогонов команды [, потому что команда [ имеет свой собственный встроенный и -a и -o, которые позволяют вам составить несколько простых тестов в один результат.

Итак, вот как вы можете реализовать тест, который вы просили, - когда вы переходите в пакетный режим, если либо вход, либо выход был перенаправлен от TTY - с помощью одного вызова [:

if [ -t 0 -a -t 1 ]
then
    echo Interactive mode
else
    echo Batch mode
fi