ก่อนที่เชลล์จะประมวลผลcat
คำสั่งบนบรรทัดคำสั่งมันจะค้นหาการเปลี่ยนเส้นทาง
มีการเปลี่ยนเส้นทางสองแบบ:
>file1
file1
ซึ่งจะทำให้การส่งออกมาตรฐานของคำสั่งไป
<file2
file2
ซึ่งจะทำให้เข้ามาตรฐานของคำสั่งมาจาก
ความจริงที่ว่าการเปลี่ยนเส้นทางเหล่านี้อยู่ในตำแหน่งที่ไม่ได้ผลบนบรรทัดคำสั่งไม่สำคัญ
$ cat <file2 >file1
เป็นเช่นเดียวกับ
$ <file2 cat >file1
ซึ่งเหมือนกับ
$ <file2 >file1 cat
etc.¹
โปรดทราบว่าcat
ยูทิลิตี้ในทุกกรณีเหล่านี้จะถูกดำเนินการโดยไม่ขัดแย้งบรรทัดคำสั่งใด ๆ การเปลี่ยนเส้นทางไม่ได้ถูกดำเนินการกับcat
คำสั่ง แต่เป็นคำแนะนำสำหรับเชลล์เพื่อตั้งค่าการเปลี่ยนเส้นทางเข้าและออกจากคำสั่ง (การเชื่อมต่ออินพุตมาตรฐานและเอาต์พุตไปยังไฟล์) เชลล์ตั้งค่าการเปลี่ยนทิศทางก่อนที่จะเรียกใช้คำสั่ง
ความแตกต่างระหว่างcat file
และcat <file
(หรือถ้าคุณต้องการ<file cat
) ก็คือในกรณีแรกcat
ยูทิลิตี้เองกำลังเปิดไฟล์ซึ่งได้รับเป็นตัวถูกดำเนินการในบรรทัดคำสั่งสำหรับการอ่านในขณะที่ในกรณีที่สองเปลือกจะ เปิดไฟล์และเชื่อมต่อcat
สตรีมอินพุตกับit² ในกรณีที่สองcat
จะสังเกตเห็นว่ามันไม่ได้รับตัวถูกดำเนินการไฟล์และจะเปลี่ยนเป็นการอ่านจากอินพุตมาตรฐานโดยอัตโนมัติ นี่คือคุณสมบัติของcat
และยูทิลิตี้อื่น ๆ ไม่ใช่สิ่งที่ยูทิลิตี้ทั้งหมดทำ
cat
-
นอกจากนี้ยังจะอ่านจากอินพุตมาตรฐานของมันถ้ามันให้ถูกดำเนินการ นี่เป็นพิเศษสำหรับcat
ยูทิลิตี้อื่น ๆ เท่านั้น (นั่นคือไม่มีสิ่งใดที่เชลล์ทำ) ที่จะใช้cat
ในไฟล์ในไดเรกทอรีปัจจุบันที่มีชื่อเป็น เพิ่มเส้นทางไปยังชื่อไฟล์เช่น-
./-
¹ ลำดับของการเปลี่ยนเส้นทางยังคงเป็นสิ่งที่สำคัญภายใต้สถานการณ์บาง; ด้วยcat <file2 >file1
ตัวอย่างเช่นfile1
จะไม่ถูกตัดทอนถ้าfile2
ไม่สามารถเข้าถึงได้ (เปลี่ยนเส้นทางที่มีการแยกวิเคราะห์จากซ้ายไปขวา) อย่างไรก็ตามการวางตำแหน่งสัมพัทธ์ของคำcat
ยังคงเป็นการสุ่มและจะไม่มีผลกับสิ่งนี้
² ดูเพิ่มเติมที่คำถาม " cat มอบข้อผิดพลาดต่าง ๆ เมื่อเปิดไฟล์ที่ไม่มีอยู่ "
ความจริงที่ว่าเชลล์ตั้งค่าการเปลี่ยนเส้นทางก่อนที่จะดำเนินการคำสั่งบนบรรทัดคำสั่งคือสาเหตุที่สิ่งต่าง ๆ เหล่านี้ล้มเหลวและคุณท้ายด้วยไฟล์เอาต์พุตที่ว่างเปล่า:
$ sort file >file
ที่นี่เชลล์จะตัดทอน (ว่าง) ไฟล์file
ก่อนที่จะดำเนินการsort file
และเชื่อมต่อsort
เอาต์พุตมาตรฐานของไฟล์ sort
ยูทิลิตี้จากนั้นจะเปิดfile
และจัดเรียงเนื้อหา (ซึ่งเป็นอะไร) ผล (อะไร) file
จะถูกส่งผ่านกระแสออกมาตรฐานการ
การแก้ไขในกรณีนี้โดยเฉพาะ (สำหรับการเรียงลำดับไฟล์ "ในสถานที่") คือ
$ sort -o file file
หรือ
$ sort file >file.sorted && mv file.sorted file
ซึ่งจะมากหรือน้อยsort
เมื่อใช้-o
ไฟล์เพื่อระบุชื่อไฟล์เอาต์พุต
เพียงสำรองคำสั่งที่การเปลี่ยนเส้นทางอาจนำหน้าชื่อจริงของยูทิลิตี้ในบรรทัดคำสั่ง:
"คำสั่งอย่างง่าย" คือลำดับของการกำหนดตัวแปรและการเปลี่ยนเส้นทางที่เป็นทางเลือกในลำดับใดก็ได้ตามด้วยคำและการเปลี่ยนเส้นทางซึ่งสิ้นสุดลงโดยผู้ควบคุม [อ้างอิง: ภาษาคำสั่ง POSIX Shell 2.9.1 คำสั่งง่าย ๆ ]
และยังเกี่ยวกับการเปลี่ยนเส้นทางที่ไม่ได้เป็นส่วนหนึ่งของตัวถูกดำเนินการของยูทิลิตี้:
จำนวนที่เป็นทางเลือกโอเปอเรเตอร์การเปลี่ยนเส้นทางและคำจะไม่ปรากฏในอาร์กิวเมนต์ที่ให้ไว้กับคำสั่งที่จะดำเนินการ (ถ้ามี) [อ้างอิง: การเปลี่ยนเส้นทางภาษาคำสั่ง POSIX Shell 2.7]