ไวยากรณ์ '<(เนื้อหาไฟล์)' ของ bash คืออะไร


25

นี้คำตอบเกี่ยวกับความมั่นคง StackExchangeใช้ไวยากรณ์ทุบตีที่น่าสนใจในการสร้างแฟ้มในบรรทัด:

openssl req -new -x509 -nodes -newkey ec:<(openssl ecparam -name secp384r1) -keyout cert.key -out cert.crt -days 3650

บิตนี้น่าสนใจเป็นพิเศษ:

<(openssl ecparam -name secp384r1)

ทำงานเพียง:

echo <(openssl ecparam -name secp384r1)

ฉันกลับมาแล้ว /dev/fd/63

ดังนั้นนี่จึงเป็นตัวบ่งชี้ไฟล์ชั่วคราวที่มีเนื้อหาของไฟล์

สิ่งนี้เรียกว่าอะไร?


3
โปรดทราบว่า "ไฟล์" ที่ได้นั้นเป็นไพพ์ที่มีชื่อและบางโปรแกรมไม่สนับสนุนไฟล์นั้นเป็นอาร์กิวเมนต์ไฟล์ ตัวอย่าง: git diff --no-index file1 <(cat file2)จะล้มเหลวด้วย: error: /dev/fd/63: unsupported file type. คุณอาจเห็นerror: readlink("/dev/fd/63"): No such file or directoryว่าการใช้งานสร้าง symlink ไปที่ไปป์ (ปรากฏเป็นลิงก์ที่ขาดให้ฉันด้วยเหตุผลบางอย่าง)
เคลวิน

คำตอบ:


35

มันเรียกว่าการทดแทนกระบวนการและเป็นคุณลักษณะของ bash, zsh และ ksh (และอาจเป็นไปได้ว่าคนอื่น ๆ ฉันไม่รู้) มันไม่ใช่ POSIX และคุณไม่ควรใช้มันในรหัสพกพา แต่มันมีประโยชน์มาก

นี่คือส่วนที่เกี่ยวข้องของคู่มือทุบตี:

3.5.6 การทดแทนกระบวนการ

การทดแทนกระบวนการได้รับการสนับสนุนบนระบบที่รองรับการตั้งชื่อไพพ์ (FIFO) หรือเมธอด / dev / fd ของการตั้งชื่อไฟล์ที่เปิด มันใช้รูปแบบของ

  <(list) 

หรือ

  >(list) 

รายการกระบวนการจะถูกรันด้วยอินพุตหรือเอาต์พุตที่เชื่อมต่อกับ FIFO หรือไฟล์บางไฟล์ใน / dev / fd ชื่อของไฟล์นี้ถูกส่งผ่านเป็นอาร์กิวเมนต์ไปยังคำสั่งปัจจุบันเป็นผลมาจากการขยายตัว หากใช้แบบฟอร์ม> (รายการ) การเขียนไปยังไฟล์จะเป็นการป้อนข้อมูลให้กับรายการ หากใช้รูปแบบ <(รายการ) ไฟล์ที่ส่งผ่านเป็นอาร์กิวเมนต์ควรอ่านเพื่อรับเอาต์พุตของรายการ โปรดทราบว่าอาจไม่มีช่องว่างระหว่าง <หรือ> และวงเล็บซ้ายมิฉะนั้นโครงสร้างจะถูกตีความว่าเป็นการเปลี่ยนเส้นทาง

เมื่อพร้อมใช้งานจะทำการทดแทนกระบวนการพร้อมกันพร้อมพารามิเตอร์และการขยายตัวแปรการทดแทนคำสั่งและการขยายเลขคณิต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.