การเปลี่ยนเส้นทาง“ <<(…)” หมายถึงอะไร


32

ฉันเห็นว่า rvm (ตัวจัดการเวอร์ชัน ruby) ติดตั้งโดยใช้คำสั่งต่อไปนี้:

bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )

ดังนั้นฉันเข้าใจว่าเราได้รับเนื้อหาของสคริปต์และส่งต่อไปยัง bash (ฉันเชื่อ< <และ<<เป็นสิ่งเดียวกันหรือไม่) ฉันสนใจใน< <ส่วนนี้พบคำอธิบายต่อไปนี้บนเน็ต:

<< โทเค็นหมายถึงใช้กระแสอินพุตปัจจุบันเป็น STDIN สำหรับโปรแกรมจนกว่าจะเห็นโทเค็น

เรื่องนี้ไม่ชัดเจนสำหรับฉันใครบางคนสามารถเป็นตัวอย่างหรืออธิบายในวิธีที่ง่ายขึ้น?

คำตอบ:


40

ไม่< <และ<<ไม่เหมือนกัน

ตัวแรกประกอบด้วย<อักขระการเปลี่ยนเส้นทางร่วมกับอักขระตัวแรกของ<(command)ไวยากรณ์ นี่คือkshโครงสร้าง (หรือที่พบในbashและzsh) ที่รู้จักกันในชื่อการทดแทนกระบวนการที่รับเอาท์พุทของcommandและจัดเตรียมไว้ในไฟล์ที่มีชื่ออ้างถึงปลายอีกด้านหนึ่งของไปป์ที่commandกำลังเขียน

ในคำอื่น ๆ ที่คุณอาจจะคิดว่า< <(command)เป็นที่ไฟล์ที่มีการส่งออกของ< filecommand


5
ฉันเรียนรู้เกี่ยวกับคำสั่งนี้เมื่อไม่กี่วันที่ผ่านมามันเป็นคำสั่งที่มีประโยชน์มาก สิ่งที่คุณสามารถทำได้ด้วยนี้จะถูก จำกัด ด้วยจินตนาการของคุณ: เช่นคำสั่งนี้จะช่วยให้คุณรายการของไฟล์ที่ซ่อนอยู่เพียง:diff <(ls) <(ls -a)
Khaja Minhajuddin

1
ไวยากรณ์นี้อาจมีประโยชน์ทีเดียว แต่ในกรณีเฉพาะของ Stonerain ดูเหมือนจะไม่ได้ให้มูลค่าเพิ่มใด ๆ เมื่อเทียบกับไพพ์ธรรมดา
jlliagre

1
ในไวยากรณ์ข้างต้นมันไม่ได้ช่วยอะไร แต่ถ้าคุณเปลี่ยนมันเล็กน้อยดีกว่า: bash <(curl ...)แทนที่จะbash < <(curl ...)ขโมย STDIN ไม่ได้ดังนั้นคุณมีอิสระที่จะตอบรับคำแนะนำและป้อนข้อมูลในสคริปต์
tylerl

การใช้ <() น่าจะเป็นทางเลือกที่ยอดเยี่ยมสำหรับการส่งตัวแปร $ หลายไปยังคำสั่งโดยตรงแทนที่จะต้องเขียนตัวแปร $ ไปยังไฟล์ก่อนโดยไม่จำเป็น diff <(echo "$ text1") <(echo "$ text2") stackoverflow.com/questions/13437104/…
Sepero

18

มันเป็นวิธีที่ซับซ้อนในการทำง่ายขึ้น:

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