(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 -tauß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 zshund seinem eigenen statBuiltin (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 grepmit seinem stdout, das zu einem Rohr geht.
ksh93Beachten 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.