(для повноти)
Хоча відповідь @ 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
, зверніть увагу, що в деяких системах вона використовує socketpairs замість труб у своїх трубопроводах.
[[ -t 0 && -t 1 ]]
якщо ви хочете лише номери рядків, якщо до терміналу підключені і стандартний вхід, і стандартний вихід.