(cho đầy đủ)
Mặc dù câu trả lời của @ enzotib có lẽ là những gì bạn muốn, nhưng đó không phải là những gì bạn yêu cầu. [ -t 1 ]
kiểm tra xem bộ mô tả tệp có phải là thiết bị đầu cuối không, đó không phải là bất kỳ thứ gì khác ngoài ống (như tệp thông thường, ổ cắm, một loại thiết bị khác như /dev/null
...)
Các [
lệnh không có tương đương -t
nhưng đối với đường ống. Để có được loại tệp được liên kết với một bộ mô tả tệp, bạn cần thực hiện fstat()
cuộc gọi hệ thống trên nó. Không có lệnh tiêu chuẩn để làm điều đó, nhưng một số hệ thống hoặc hệ vỏ có một số.
Với 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
}
Hoặc với zsh
và stat
nội dung dựng sẵn của nó (trước một vài năm của GNU), ở đây chỉ được tải dưới dạng 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
}
Bây giờ một vài lưu ý:
Đó không chỉ là đường ống vỏ sử dụng đường ống.
var=$(grep foo bar)
hoặc là:
cmd <(grep foo bar)
hoặc là:
coproc grep foo bar
cũng chạy grep
với thiết bị xuất chuẩn của nó đi đến một đường ống.
Nếu vỏ của bạn là ksh93
, lưu ý rằng trên một số hệ thống, nó sử dụng ổ cắm thay vì đường ống trong đường ống của nó.
[[ -t 0 && -t 1 ]]
nếu bạn chỉ muốn số dòng nếu cả đầu vào tiêu chuẩn và đầu ra tiêu chuẩn được kết nối với một thiết bị đầu cuối.