เพราะนั่นคือสิ่งที่มันควรจะเป็น
<(...)in bashคือไวยากรณ์สำหรับการทดแทนกระบวนการ kshก็คัดลอกมาจากผู้ประกอบการเหมือนกันใน
<, (, ), |, &, ;กำลังราชสกุลศัพท์พิเศษในการbashที่จะใช้ในการประกอบการในรูปแบบพิเศษในชุดที่แตกต่างกัน <, <(, <<, <&... แต่ละคนมีบทบาทของพวกเขา <สำหรับการเปลี่ยนเส้นทาง <file, < fileจะเปลี่ยนเส้นทางการป้อนข้อมูลจากแฟ้ม <'(file)'จะเปลี่ยนเส้นทางอินพุตจากไฟล์ที่เรียกว่า(file)แต่<(file)เป็นโอเปอเรเตอร์อื่นที่ไม่ใช่โอเปอเรเตอร์การเปลี่ยนเส้นทาง
< (file)จะตามมาด้วย< (file)ในบริบทว่าในbash, (file)ไม่ถูกต้อง (...)สามารถใช้ได้เป็นโทเค็นเดียวในบางบริบทเช่น:
(sub shell)
func () {
...
}
var=(foo bar)
แต่ไม่ใช่ค่ะ
sort < (cmd)
ในfishเปลือกมันแตกต่างกัน ในfish, (...)สำหรับแทนคำสั่ง (เทียบเท่า$(...)ในbash) และ<สำหรับการเปลี่ยนเส้นทางอินพุตเช่นในเชลล์คล้ายบอร์น
ดังนั้นในfish:
sort <(echo file)
จะเหมือนกับ:
sort < (echo file)
นั่นคือ:
sort < file
แต่นั่นเป็นสิ่งที่แตกต่างจากbashการทดแทนกระบวนการอย่างสิ้นเชิง
ในyashเชลล์ POSIX เชลล์อื่น<(...)ไม่ได้ใช้สำหรับการทดแทนกระบวนการแต่สำหรับการเปลี่ยนเส้นทางกระบวนการ
ในนั้น,
sort <(ls -l)
ย่อจาก:
sort 0<(ls -l)
เป็นผู้ดำเนินการเปลี่ยนเส้นทาง มันมากหรือน้อยเทียบเท่ากับ:
ls -l | sort
ขณะที่อยู่ในbashนั้น<(ls -l)จะถูกขยายไปยังเส้นทางของไปป์ดังนั้นมันจึงเป็นดังนี้:
ls -l | sort /dev/fd/0
ในzshนั้น(...)มีการใช้งานมากเกินไปในฐานะผู้ดำเนินการ globbing ( (*.txt|*.png)จะขยายไปยังtxtและpngไฟล์) และเป็นตัวระบุ glob ( *(/)ตัวอย่างเช่นขยายไปยังไฟล์ไดเรกทอรี)
ในzshใน:
sort < (ls -l)
ที่(ls -l)จะถือว่าเป็นรอบคัดเลือก ตัวระบุแบบlกลมคือจับคู่กับจำนวนลิงก์และคาดว่าจะมีตัวเลขหลังจากนั้นl(ตามที่ls -ld ./*(l2)จะแสดงรายการไฟล์ที่มี 2 ลิงก์) ดังนั้นนั่นคือสาเหตุที่คุณได้รับzsh: number expectedข้อผิดพลาดที่นั่น
sort < (w)จะได้รับzsh: no matches found: (w)ข้อผิดพลาดแทน(w)ตรงกับไฟล์ที่มีชื่อว่างที่สามารถเขียนได้
sort < (w|cat)จะมีการเรียงลำดับเนื้อหาของwและ / หรือcatไฟล์ในไดเรกทอรีปัจจุบัน ...