(untuk kelengkapan)
Meskipun jawaban @ enzotib kemungkinan besar adalah yang Anda inginkan, itu bukan apa yang Anda minta. [ -t 1 ]
memeriksa apakah deskriptor file adalah perangkat terminal, bukankah itu selain pipa (seperti file biasa, soket, jenis perangkat lain seperti /dev/null
...)
The [
perintah tidak memiliki setara -t
tetapi untuk pipa. Untuk mendapatkan jenis file yang terkait dengan deskriptor file, Anda perlu melakukan fstat()
panggilan sistem di atasnya. Tidak ada perintah standar untuk melakukan itu, tetapi beberapa sistem atau shell memiliki beberapa.
Dengan 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
}
Atau dengan zsh
dan stat
bawaannya sendiri (yang mendahului GNU beberapa tahun kemudian), zstat
hanya dimuat di sini :
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
}
Sekarang beberapa catatan:
Bukan hanya shell pipelines yang menggunakan pipa.
var=$(grep foo bar)
atau:
cmd <(grep foo bar)
atau:
coproc grep foo bar
juga berjalan grep
dengan stdout pergi ke pipa.
Jika shell Anda ksh93
, perhatikan bahwa pada beberapa sistem, ia menggunakan socketpairs bukan pipa di pipelines-nya.
[[ -t 0 && -t 1 ]]
jika Anda hanya ingin nomor baris jika input standar dan output standar terhubung ke terminal.