(для полноты)
Хотя ответ @enzotib , скорее всего, является тем, что вы хотите, это не то, о чем вы просили. [-t 1]
проверяет, является ли дескриптор файла оконечным устройством, а не чем-то другим, кроме канала (например, обычным файлом, сокетом, устройством другого типа, например / dev / null
...)
Команда [
не имеет эквивалента -t
, кроме каналов. Чтобы получить тип файла, связанный с файловым дескриптором, необходимо выполнить для него системный вызов fstat ()
. Для этого нет стандартной команды, но в некоторых системах или оболочках они есть.
С помощью 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
}
Или с помощью zsh
и собственной встроенной stat
(которая предшествует GNU на несколько лет), здесь загружается как Только 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
}
Теперь несколько примечаний:
Каналы используются не только в конвейерах оболочки .
var=$(grep foo bar)
или:
cmd <(grep foo bar)
или:
coproc grep foo bar
также запустите grep
с его стандартным выводом, идущим в конвейер.
Если ваша оболочка - ksh93
, обратите внимание, что в некоторых системах она использует пары сокетов вместо каналов в своих конвейерах.