(เพื่อความสมบูรณ์)
แม้ว่าคำตอบของ @ enzotibอาจเป็นสิ่งที่คุณต้องการมากที่สุด แต่ก็ไม่ใช่สิ่งที่คุณต้องการ [ -t 1 ]
ตรวจสอบว่า file descriptor เป็นอุปกรณ์เทอร์มินัลไม่ใช่ว่ามันเป็นอย่างอื่นนอกจากไพพ์ (เช่นไฟล์ปกติซ็อกเก็ตอุปกรณ์ประเภทอื่นเช่น/dev/null
... )
[
คำสั่งมีเทียบเท่าไม่-t
แต่สำหรับท่อ ในการรับชนิดของไฟล์ที่เชื่อมโยงกับ file descriptor คุณจะต้องทำการ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
builtin ของตัวเอง(ซึ่งมีมาก่อน 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
ด้วย stdout ของมันจะไปป์
หากเปลือกของคุณksh93
ทราบว่าในบางระบบมันจะใช้ซ็อกเก็ตคู่แทนท่อในท่อ
[[ -t 0 && -t 1 ]]
หากคุณต้องการเพียงหมายเลขบรรทัดหากทั้งอินพุตมาตรฐานและเอาต์พุตมาตรฐานเชื่อมต่อกับเทอร์มินัล