(por completitud)
Si bien la respuesta de @ enzotib es probablemente lo que quieres, no es lo que pediste. [ -t 1 ]
comprueba si el descriptor de archivo es un dispositivo terminal, no es otra cosa que una tubería (como un archivo normal, un zócalo, otro tipo de dispositivo como /dev/null
...)
El [
comando no tiene equivalente -t
sino para tuberías. Para obtener el tipo de archivo asociado con un descriptor de archivo, debe realizar la fstat()
llamada del sistema en él. No hay un comando estándar para hacer eso, pero algunos sistemas o shells tienen algunos.
Con 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
}
O con zsh
y su propio stat
incorporado (que precede a GNU por unos años), aquí cargado como zstat
solo:
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
}
Ahora algunas notas:
No solo las tuberías de concha utilizan tuberías.
var=$(grep foo bar)
o:
cmd <(grep foo bar)
o:
coproc grep foo bar
También se ejecuta grep
con su stdout yendo a una tubería.
Si su shell es ksh93
, tenga en cuenta que en algunos sistemas, utiliza pares de enchufes en lugar de tuberías en sus tuberías.
[[ -t 0 && -t 1 ]]
si solo desea números de línea si tanto la entrada estándar como la salida estándar están conectadas a un terminal.