(zur Vollständigkeit)
Während die Antwort von @enzotib höchstwahrscheinlich das ist, was Sie wollen, ist es nicht das, wonach Sie gefragt haben. [ -t 1 ]
prüft, ob es sich bei dem Dateideskriptor um ein Endgerät handelt, nicht um eine andere Pipe (wie eine normale Datei, einen Socket, einen anderen Gerätetyp wie /dev/null
...)
Der [
Befehl hat keine Entsprechung -t
außer für Pipes. Um den Dateityp zu ermitteln, der einem Dateideskriptor zugeordnet ist, müssen Sie den fstat()
Systemaufruf für diesen ausführen . Dafür gibt es keinen Standardbefehl, aber einige Systeme oder Shells haben einen.
Mit 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
}
Oder mit zsh
und seinem eigenen stat
Builtin (das ein paar Jahre älter ist als GNU), hier nur geladen als zstat
:
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
}
Nun ein paar Anmerkungen:
Es sind nicht nur Shell- Pipelines , die Pipelines verwenden.
var=$(grep foo bar)
oder:
cmd <(grep foo bar)
oder:
coproc grep foo bar
laufen Sie auch grep
mit seinem stdout, das zu einem Rohr geht.
ksh93
Beachten Sie, dass Ihre Shell auf einigen Systemen Socket-Paare anstelle von Pipes in ihren Pipelines verwendet.
[[ -t 0 && -t 1 ]]
wenn Sie nur Zeilennummern wünschen, wenn sowohl die Standardeingabe als auch die Standardausgabe an ein Terminal angeschlossen sind.