(Tamamlamak için)
İken @ enzotib cevabı büyük olasılıkla istediğini, bu sen istedin değil. [ -t 1 ]
Dosya tanımlayıcısının bir uçbirim aygıtı olup olmadığını denetler, borudan başka bir şey olmadığını (normal bir dosya, bir soket, /dev/null
... gibi başka bir aygıt türü ...)
[
Komutu muadili yoktur -t
ama borular içindir. Bir dosya tanıtıcısına bağlı dosyanın türünü almak için, fstat()
sistem çağrısı üzerinde yapmanız gerekir . Bunu yapmak için standart bir komut yoktur, ancak bazı sistemler veya mermilerde bazıları vardır.
GNU ile 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
}
Ya da zsh
ve kendi stat
yerleşikleri ile (GNU'yu birkaç yıl önce öldüren), buraya zstat
sadece yüklendi :
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
}
Şimdi birkaç not:
Sadece boru kullanan kabuk boru hatları değil .
var=$(grep foo bar)
veya:
cmd <(grep foo bar)
veya:
coproc grep foo bar
ayrıca grep
stdout bir boruya gidiyor.
Kabuğunuz varsa ksh93
, bazı sistemlerde, boru hatlarındaki borular yerine soket çiftleri kullandığına dikkat edin.
[[ -t 0 && -t 1 ]]
eğer sadece standart giriş ve standart çıkış bir terminale bağlıysa hat numaralarını istiyorsanız testi yapın .