ในแง่ของการพกพา:
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
จะหมายถึงการทำตามค่าเริ่มต้นอาจจะคิดว่าคุณกำลังพยายามที่จะทำให้อุปกรณ์ได้เป็นอย่างดีfile
null
eval > file
eval '' > file
หรือ file
ทำงานอะไรและเปลี่ยนเส้นทางการส่งออกไปยัง ทำให้รู้สึกถึงฉัน แปลกที่มันไม่ใช่สำนวนสามัญ
printf '' > file
: ไม่พิมพ์อะไรลงในไฟล์อย่างชัดเจน คนที่เหมาะสมที่สุดสำหรับฉัน
ในแง่ของประสิทธิภาพ
ความแตกต่างจะเป็นว่าเราใช้เชลล์บิวท์อินหรือไม่ หากไม่เป็นเช่นนั้นกระบวนการจะต้องถูกแยกออกคำสั่งจะถูกโหลดและดำเนินการ
eval
รับประกันว่าจะสร้างขึ้นในทุกเชลล์ :
มีในตัวทุกที่ที่มี (ชอบ Bourne / csh) true
ถูกสร้างขึ้นในเชลล์ที่เหมือนบอร์นเท่านั้น
printf
fish
ถูกสร้างขึ้นในบอร์นที่ทันสมัยที่สุดเหมือนเปลือกหอยและ
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
ในกระสุนที่มีลักษณะคล้ายบอร์นและไม่ได้ใช้สิ่งใดนอกจากหอยที่มีลักษณะคล้ายบอร์นในปัจจุบัน