ในแง่ของการพกพา:
Bourne POSIX zsh csh/tcsh rc/es fish
> file Y Y N(1) N(1) N N
: > file N/Y(2) Y(3) Y Y(4) N(5) N(5)
true > file Y(5) Y Y Y(5) Y(5) Y(5)
cat /dev/null > file Y(5) Y Y(5) Y(5) Y(5) Y(5)
eval > file Y(3,8) Y(3) Y Y(6) Y Y
cp /dev/null file (7) Y(5) Y Y(5) Y(5) Y(5) Y(5)
printf '' > file Y(5) Y Y Y(5) Y(5) Y
หมายเหตุ:
- ยกเว้นใน
shหรือkshจำลองสำหรับการเปลี่ยนเส้นทางโดยไม่มีคำสั่งใน zsh คำสั่งเริ่มต้นจะถือว่า (เพจเจอร์สำหรับการเปลี่ยนเส้นทาง stdin เท่านั้นcatมิฉะนั้น) ที่สามารถปรับด้วยตัวแปร NULLCMD และ READNULLCMD นั่นเป็นแรงบันดาลใจจากคุณสมบัติที่คล้ายกันใน(t)csh
- การเปลี่ยนเส้นทางครั้งแรกไม่ได้ดำเนินการ
:ใน UnixV7 ซึ่ง:ถูกตีความไปครึ่งทางระหว่างผู้นำความคิดเห็นและคำสั่งที่เป็นโมฆะ หลังจากนั้นพวกเขาและชอบสำหรับ builtins ทั้งหมดหากการเปลี่ยนเส้นทางล้มเหลวนั่นจะออกจากเชลล์
:และevalเป็นบิวด์อินพิเศษหากการเปลี่ยนเส้นทางล้มเหลวนั่นจะออกจากเชลล์ ( bashเฉพาะในโหมด POSIX)
- ที่น่าสนใจ
(t)cshคือการกำหนดป้ายกำกับว่าง (สำหรับgoto) ดังนั้นgoto ''จะมีสาขาที่นั่น หากการเปลี่ยนเส้นทางล้มเหลวนั่นจะเป็นการออกจากเชลล์
- เว้นแต่ / ถ้าคำสั่งที่เกี่ยวข้องมีอยู่ใน
$PATH( :โดยทั่วไปไม่ได้; true, cat, cpและprintfโดยทั่วไปจะ (POSIX ต้องการให้พวกเขา))
- หากการเปลี่ยนเส้นทางล้มเหลวนั่นจะเป็นการออกจากเชลล์
- หาก
fileเป็น symlink ไปยังไฟล์ที่ไม่มีอยู่cpการใช้งานบางอย่างเช่น GNU's จะปฏิเสธที่จะสร้างมันขึ้นมา
- เชลล์เป้าหมายรุ่นแรกไม่รองรับการเปลี่ยนเส้นทางบิวอิน
ในแง่ของความชัดเจน:
(ส่วนนี้มีความคิดเห็นสูง)
> file. ที่>มีลักษณะเหมือนพรอมต์หรือความคิดเห็นมากเกินไป นอกจากนี้คำถามที่ฉันจะถามเมื่ออ่านว่า (และเชลล์ส่วนใหญ่จะบ่นเกี่ยวกับสิ่งเดียวกัน) คือผลลัพธ์อะไรที่คุณเปลี่ยนเส้นทาง? .
: > file. :เรียกว่าคำสั่ง no-op เพื่อให้อ่านได้ทันทีว่าเป็นการสร้างไฟล์เปล่า อย่างไรก็ตามที่นี่อีกครั้งที่:สามารถพลาดและ / หรือมองว่าเป็นพรอมต์
true > file: บูลีนทำอะไรกับการเปลี่ยนเส้นทางหรือเนื้อหาไฟล์ ที่นี่มีความหมายอะไร? เป็นสิ่งแรกที่อยู่ในใจของฉันเมื่อฉันอ่านมัน
cat /dev/null > file. Concatenate /dev/nullเข้าfile? catถูกมองเห็นได้บ่อยเท่าที่เป็นคำสั่งเพื่อการถ่ายโอนข้อมูลเนื้อหาของไฟล์ที่ยังคงสามารถทำให้ความรู้สึก: การถ่ายโอนข้อมูลเนื้อหาของไฟล์ที่ว่างเปล่าลงไปในfile , bit เช่นวิธีที่ซับซ้อนที่จะพูดcp /dev/null fileแต่ก็ยังเข้าใจ
cp /dev/null file. คัดลอกเนื้อหาของแฟ้มที่ว่างเปล่าfileไป ทำให้รู้สึกว่ามีใครบางคนไม่ทราบว่าวิธีcpจะหมายถึงการทำตามค่าเริ่มต้นอาจจะคิดว่าคุณกำลังพยายามที่จะทำให้อุปกรณ์ได้เป็นอย่างดีfilenull
eval > fileeval '' > fileหรือ fileทำงานอะไรและเปลี่ยนเส้นทางการส่งออกไปยัง ทำให้รู้สึกถึงฉัน แปลกที่มันไม่ใช่สำนวนสามัญ
printf '' > file: ไม่พิมพ์อะไรลงในไฟล์อย่างชัดเจน คนที่เหมาะสมที่สุดสำหรับฉัน
ในแง่ของประสิทธิภาพ
ความแตกต่างจะเป็นว่าเราใช้เชลล์บิวท์อินหรือไม่ หากไม่เป็นเช่นนั้นกระบวนการจะต้องถูกแยกออกคำสั่งจะถูกโหลดและดำเนินการ
evalรับประกันว่าจะสร้างขึ้นในทุกเชลล์ :มีในตัวทุกที่ที่มี (ชอบ Bourne / csh) trueถูกสร้างขึ้นในเชลล์ที่เหมือนบอร์นเท่านั้น
printffishถูกสร้างขึ้นในบอร์นที่ทันสมัยที่สุดเหมือนเปลือกหอยและ
cpและcatโดยทั่วไปไม่ได้มีอยู่แล้ว
ตอนนี้cp /dev/null fileไม่เรียกใช้การเปลี่ยนเส้นทางของเชลล์ดังนั้น:
find . -exec cp /dev/null {} \;
กำลังจะมีประสิทธิภาพมากกว่า:
find . -exec sh -c '> "$1"' sh {} \;
(แม้ว่าจะไม่จำเป็นกว่า:
find . -exec sh -c 'for f do : > "$f"; done' sh {} +
)
ส่วนตัว
โดยส่วนตัวแล้วฉันใช้: > fileในกระสุนที่มีลักษณะคล้ายบอร์นและไม่ได้ใช้สิ่งใดนอกจากหอยที่มีลักษณะคล้ายบอร์นในปัจจุบัน