Una ท่อหรือ pipe เป็นไปป์ไลน์สำหรับ UNIX / Linux และใช้งานได้จริง แต่เพื่อให้เข้าใจอย่างถ่องแท้ว่าไปป์คืออะไรคุณควรรู้ว่าในสภาพแวดล้อม * nix มีสตรีมข้อมูลในตัว 3 สตรีม สำหรับผู้ที่ไม่ทราบหมายความว่าข้อมูลสามารถเดินทางไปยังหรือจากจุดสามจุดได้
แล้วคุณจะเข้าใจสิ่งนี้ในทางที่ดีขึ้นแต่สิ่งที่ฉันอยากจะบอกคุณให้ชัดเจนในตอนนี้ก็คือสิ่งที่คุณทำได้คือช่องทางจากจุดใดจุดหนึ่งไปยังผู้อื่น สิ่งนี้ช่วยให้สามารถรับเอาท์พุทหรือผลลัพธ์ที่โปรแกรมส่งไปยังอินพุตของอีกรายการเพื่อใช้งานเป็นต้น ฉันจะพยายามอธิบายด้วยตัวอย่างที่ใช้ได้จริงซึ่งจะช่วยให้คุณเข้าใจได้เป็นอย่างดี
ประเด็นเหล่านั้นที่ฉันพูดถึงหรือ สตรีมข้อมูลคือ:
- สเตดิน: สอดคล้องกับ 0 และเป็นอินพุตมาตรฐาน โดยทั่วไปอินพุตมาตรฐานสำหรับระบบ * nix คือแป้นพิมพ์ นั่นคือสิ่งที่คุณพิมพ์จะเป็นข้อมูลที่ใช้ เธอมีอุปกรณ์พิเศษที่เกี่ยวข้องซึ่งก็คือ / dev / stdin
- แย่: ระบุด้วย 1 เป็นเอาต์พุตมาตรฐาน โดยปกติจะตรงกับจอภาพหรือหน้าจอคอมพิวเตอร์ของคุณซึ่งเป็นที่ที่คุณสามารถดูข้อมูลได้ ตัวอย่างเช่นเมื่อคุณเรียกใช้คำสั่ง ls รายการเนื้อหาจะแสดงบนหน้าจอใช่ไหม? อุปกรณ์ที่เกี่ยวข้องคือ / dev / stdout
- สตเดอร์: ระบุด้วย 2 เป็นเอาต์พุตข้อผิดพลาดมาตรฐานเมื่อเกิดข้อผิดพลาดในโปรแกรม อุปกรณ์ที่เกี่ยวข้องคือ / dev / stderr
ด้วยไปป์ไลน์คุณสามารถทำให้เอาต์พุตมาตรฐานหรือ stdout ของคำสั่งหนึ่งส่งผ่านไปยังอินพุตมาตรฐานของอีกคำสั่งได้โดยตรง. นั่นคือคุณสามารถทำให้โปรแกรมหนึ่งฟีดอีกโปรแกรมหนึ่งได้ แทนที่จะใช้พารามิเตอร์ที่ป้อนด้วยแป้นพิมพ์ไปป์จะส่งข้อมูลที่สร้างโดยคำสั่งก่อนหน้านี้ผ่านไปป์ไลน์ที่แสดงโดย |
กับ ตัวอย่าง คุณจะเข้าใจมันได้ดีขึ้น สมมติว่าคุณต้องการแสดงรายการเนื้อหาของไดเร็กทอรี แต่คุณสนใจที่จะดูชื่อที่ตรงกับคำว่า doc เท่านั้น ดังนั้นคุณสามารถใช้ไปป์ไลน์เพื่อไพพ์เอาต์พุตของ ls ไปยังอินพุตของตัวกรอง grep เพื่อบอกให้แสดงเฉพาะที่ตรงกับรูปแบบนั้น:
ls -l | grep doc
ดังนั้นแทนที่จะแสดงชื่อทั้งหมดให้คุณดูมันก็แสดงให้คุณเห็น คนที่คุณสนใจจริงๆ. คุณสามารถทำเช่นเดียวกันกับเนื้อหาของไฟล์ ลองนึกภาพว่าคุณต้องการดูข้อมูลของกระบวนการที่ชื่อว่า firefox เท่านั้นไม่ใช่ทั้งหมด:
ps aux | grep firefox
แทนที่จะแสดงผลลัพธ์ทั้งหมดของโปรแกรม ps บนหน้าจอ (stdout) สิ่งที่ทำคือส่งสัญญาณไปยังอินพุตของตัวกรอง grep และแสดงเฉพาะในเอาต์พุตที่ตรงกับรูปแบบ firefox ในกรณีนี้ ...
ถ้าคุณต้องการคุณสามารถใช้ ท่อต่างๆ เพื่อนำเอาต์พุตของคำสั่งหนึ่งไปยังอินพุตของคำสั่งที่สองอื่นและเอาต์พุตของวินาทีนั้นไปยังอินพุตของหนึ่งในสามและอื่น ๆ ตัวอย่างเช่น:
cat libro | grep love | more
อย่างที่คุณเห็น, ความเป็นไปได้มีมากมายทุกสิ่งที่คุณสามารถจินตนาการได้และได้รับอนุญาต แม้แต่แสดงเฉพาะบรรทัดแรกและบรรทัดสุดท้ายของไฟล์นับบรรทัดที่ป้อน wc ที่มาจากรายการและจัดเรียงด้วย:
cat listado | head cat listado | tail cat listado | wc -l cat listado | sort
คุณยังสามารถทำงานกับไฟล์ ข้อผิดพลาดกับ | & และตัวอย่างเช่นค้นหาคำว่า alert ในเอาต์พุตของสคริปต์หากล้มเหลว:
./miscript |& grep alerta
และสุดท้ายมีสองคำสั่งที่เชื่อมโยงอย่างใกล้ชิดกับท่อนั่นคือ ทีและ xargs และพวกเขาสามารถขยายความเป็นไปได้ของสิ่งเหล่านี้เพิ่มเติม ในกรณีของทีสิ่งที่จะอนุญาตคือการแสดงผลลัพธ์ของโปรแกรมก่อนหน้าบนเอาต์พุตมาตรฐานเพื่อให้คุณสามารถดูได้และนอกจากนั้นยังสามารถไพพ์ไปยังไฟล์อื่นได้ ตัวอย่างเช่นหากคุณแสดงรายการเนื้อหาของไดเร็กทอรีและต้องการดูผลลัพธ์ของ ls -l ในขณะนี้และบันทึกไว้ใน file listing.txt:
ls -l | tee listado.txt
หากคุณไม่ใช้ทีคุณจะไม่สามารถเห็นผลลัพธ์บนคอนโซลของคุณ ...
Y xargs มันน่าสนใจยิ่งขึ้นในบางกรณี ในกรณีนี้จะสามารถสร้างคำสั่งจากอินพุตมาตรฐานที่ได้รับผ่านไปป์ไลน์ กล่าวอีกนัยหนึ่งก็คือสามารถจับทุกอย่างที่โปรแกรมก่อนหน้านี้เปิดตัวผ่านเอาต์พุตและส่งต่อ xargs ผ่านไปป์ไลน์เพื่อส่งต่อไปยังคำสั่งอื่นเป็นอาร์กิวเมนต์
ยังไม่เข้าใจ? คุณจะเห็นได้ดีขึ้นมากด้วยตัวอย่าง สมมติว่าคุณต้องการลบไฟล์ thumbs.db ที่น่ารังเกียจทั้งหมดออกจากไดเร็กทอรีดิสก์หรือพาร์ติชัน หากมีจำนวนมากอาจเป็นไปไม่ได้ที่จะดำเนินการทีละรายการโดยใช้คำสั่ง rm เพื่อลบด้วยตนเอง แต่ด้วย xargs คุณสามารถทำให้ทุกอย่างเป็นไปโดยอัตโนมัติ และคุณสามารถทำได้โดยใช้ find เพื่อหาตำแหน่งส่งเอาต์พุตผ่านอินพุตของ xargs และสิ่งนี้จะให้ชื่อ rm เป็นอาร์กิวเมนต์ ดังนั้นสิ่งที่อยู่ทั้งหมดจะถูกลบโดยอัตโนมัติ:
find ./ -name "thumbs.db" | xargs rm
ตัวอย่างเช่นสมมติว่าค้นหาตำแหน่ง /home/name/thumbs.db, /media/test/thumbs.db และ /tmp/thumbs.db เอาล่ะ xargs จะส่งพวกมันไปที่ rm ราวกับว่าพวกมันเป็นข้อโต้แย้ง นั่นคือราวกับว่าเราได้ดำเนินการ: rm /home/name/thumbs.db แล้ว rm /media/test/thumbs.db แล้ว rm /tmp/thumbs.db
ยอดเยี่ยมข้อมูลนี้มีความสำคัญมากสำหรับผู้ใช้ linux ของเรา
เป็นบทความที่ดีตอนนี้ที่ฉันกำลังศึกษาการเปลี่ยนเส้นทาง I / O ในหนังสือ The Linux Command Line มันชัดเจนกว่าสำหรับฉันเกี่ยวกับท่อ (Pipeline) และสตรีมข้อมูลสามสาย ผลงานเป็นที่ชื่นชม ทักทาย.
ตัวอย่างที่มี xargs เหมาะกับฉันเช่นถุงมือ ตรงกับวันนี้ฉันกำลังจัดการกับรายละเอียดของทางออกหลายทางที่ฉันต้องส่ง "เป็นส่วน ๆ " xargs เดิน pinturita
ซาบซึ้งสุด ๆ !