Ответ 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
Надеюсь, это поможет.
Я хочу, чтобы моя оболочка обнаруживала поведение человека, а затем показывала приглашение.
Итак, предположим, что имя файла - 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
чтобы разработать, я бы попробовал
if [ -t 0 ] ; then
# this shell has a std-input, so we're not in batch mode
.....
else
# we're in batch mode
....
fi
Надеюсь, это поможет.
От help test
:
-t FD True if FD is opened on a terminal.
Вы можете использовать программу /usr/bin/tty
:
if tty -s
then
# ...
fi
Я признаю, что я не уверен, насколько он переносим, но это, по крайней мере, часть GNU coreutils.
Обратите внимание, что нет необходимости использовать многомерные операторы оболочки &&
и ||
для объединения двух отдельных прогонов команды [
, потому что команда [
имеет свой собственный встроенный и -a
и -o
, которые позволяют вам составить несколько простых тестов в один результат.
Итак, вот как вы можете реализовать тест, который вы просили, - когда вы переходите в пакетный режим, если либо вход, либо выход был перенаправлен от TTY - с помощью одного вызова [
:
if [ -t 0 -a -t 1 ]
then
echo Interactive mode
else
echo Batch mode
fi