(dla pełności)
Chociaż odpowiedź @ enzotib jest najprawdopodobniej tym, czego chcesz, to nie o to prosiłeś. [ -t 1 ]
sprawdza, czy deskryptor pliku jest urządzeniem końcowym, a nie tym, że jest czymś innym niż potok (jak zwykły plik, gniazdo, inny typ urządzenia, taki jak /dev/null
...)
[
Komenda nie ma odpowiednika -t
, ale do rur. Aby uzyskać typ pliku skojarzonego z deskryptorem pliku, należy wykonać na nim fstat()
wywołanie systemowe. Nie ma do tego standardowego polecenia, ale niektóre systemy lub powłoki mają takie.
Z GNU stat
:
grep() {
if { [ "$(LC_ALL=C stat -c %F - <&3)" = fifo ]; } 3>&1 ||
[ "$(LC_ALL=C stat -c %F -)" = fifo ]; then
command grep "$@"
else
command grep -n "$@"
fi
}
Albo zsh
i własny stat
wbudowany (który poprzedza jeden GNU przez kilka lat), tutaj załadowany jak zstat
tylko:
grep() {
zmodload -F zsh/stat b:zstat
local stdin_type stdout_type
if zstat -A stdin_type -s -f 0 +mode &&
zstat -A stdout_type -s -f 1 +mode &&
[[ $stdin_type = p* || $stdout_type = p* ]]
then
command grep "$@"
else
command grep -n "$@"
fi
}
Teraz kilka notatek:
Nie tylko rurociągi powłokowe używają rur.
var=$(grep foo bar)
lub:
cmd <(grep foo bar)
lub:
coproc grep foo bar
także biegnij grep
ze stdout do rury.
Jeśli twoja powłoka jest ksh93
, pamiętaj, że w niektórych systemach używa potoków zamiast potoków w swoich potokach.
[[ -t 0 && -t 1 ]]
jeśli chcesz numery linii tylko wtedy, gdy zarówno standardowe wejście, jak i standardowe wyjście są podłączone do terminala.