2012-04-05 14 views
11

Chcę, aby moja powłoka wykryła ludzkie zachowanie, a następnie pokaż monit.sprawdź isatty w bash

Więc przyjmijmy, że nazwa pliku jest 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 

Ale uważam, że to nie może działać, jeśli nie zostały ustawione PS1. Czy istnieje lepsza metoda?

moje metody badań:

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

Odpowiedz

28

opracowania, chciałbym spróbować

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

    .... 
fi 

Mam nadzieję, że to pomaga.

+3

Twoja próbka jest odpowiednia dla ** stdin ** case, dla ** stdout **, możemy użyć 'if [-t 1]'. –

+1

najlepszą odpowiedzią byłoby 'if [-t 0] && [-t 1]' –

+0

Dzięki za udostępnienie. Wydaje się to dobrym pomysłem. Kiedyś mniej znaczy więcej, czasami mniej jest po prostu mniej. Więc ... Czy jest to nowy paradygmat skryptów powłoki, którego nie jestem świadomy, czy twoja osobista opinia? Powodzenia wszystkim. – shellter

7

Od help test:

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

dziękuję, twoja odpowiedź jest poprawna, ale następna odpowiedź jest jaśniejsza. –

5

Można skorzystać z programu /usr/bin/tty:

if tty -s 
then 
    # ... 
fi 

Przyznaję, że nie jestem pewien, jak jest przenośny, ale jest to przynajmniej część coreutils GNU.

+0

Według [this] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/tty.html), 'tty' może nie obsługiwać opcji' -s'. Więc albo użyj '[-t N]', albo przekieruj wyjście do '/ dev/null'. –

+0

A jeśli chcesz sprawdzić standardowe wyjście, a nie standardowe wejście, wykonaj 'tty

2

pamiętać, że nie jest konieczne stosowanie beefy && i || operatorów powłoki połączyć dwa oddzielne biegi dowodzenia na [, ponieważ komenda [ posiada własne wbudowane i-a i lub-o operatory pozwól ci skomponować kilka prostszych testów w jeden wynik.

Tak, o to w jaki sposób można wdrożyć test, jaki hasła - gdzie można przerzucić w trybie wsadowym jeśli albo wejściowego lub wyjście został przekierowany od TTY - za pomocą jednego wywołanie [ :

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

Kontrola powłoki "[a] && [b]' jest bardziej przenośna niż '[a -ab]', chociaż . – bacondropped

+0

(Jeśli interesują Cię szczegóły, oto komunikat, który daje: 'SC2166: Preferuj [p] i& [q] jako [p -a q] nie jest dobrze zdefiniowany.) – bacondropped