มีความแตกต่างระหว่างอาร์กิวเมนต์บรรทัดคำสั่งและอินพุตมาตรฐาน ไพพ์จะเชื่อมต่อเอาต์พุตมาตรฐานของกระบวนการหนึ่งไปยังอินพุตมาตรฐานของอีกกระบวนการหนึ่ง ดังนั้น
ls | echo
เชื่อมต่อเอาต์พุตมาตรฐานของ ls กับอินพุตมาตรฐานของ echo ใช่มั้ย echo จะละเว้นอินพุตมาตรฐานและจะดัมพ์อาร์กิวเมนต์บรรทัดคำสั่ง - ซึ่งไม่มีในกรณีนี้เพื่อ - stdout ของตัวเอง ผลลัพธ์: ไม่มีอะไรเลย
มีวิธีแก้ปัญหาบางอย่างในกรณีนี้ หนึ่งคือการใช้คำสั่งที่อ่าน stdin และทิ้งเพื่อ stdout เช่น cat
ls | cat
จะ 'ทำงาน' ขึ้นอยู่กับความหมายของงานของคุณ
แต่สิ่งที่เกี่ยวกับกรณีทั่วไป สิ่งที่คุณต้องการคือการแปลง stdout ของคำสั่งหนึ่งเป็นบรรทัดคำสั่ง args ของอีกคำสั่งหนึ่ง ดังที่คนอื่น ๆ พูดกันว่าxargs
เป็นเครื่องมือตัวช่วย canonical ในกรณีนี้การอ่านบรรทัดคำสั่ง args สำหรับคำสั่งจาก stdin และการสร้างคำสั่งเพื่อเรียกใช้
ls | xargs echo
คุณสามารถแปลงบางส่วนนี้โดยใช้คำสั่งการแทนที่ $()
echo $(ls)
จะทำในสิ่งที่คุณต้องการ
เครื่องมือทั้งสองนี้เป็นแกนหลักในการเขียนสคริปต์ของเชลล์คุณควรเรียนรู้ทั้งสองอย่าง
เพื่อความสมบูรณ์ตามที่คุณระบุในคำถามวิธีอื่น ๆ ในการแปลง stdin เป็นบรรทัดคำสั่ง args คือread
คำสั่งbuiltin ของเชลล์ มันจะแปลง "words" (คำที่กำหนดโดยIFS
ตัวแปร) เป็นตัวแปร temp ซึ่งคุณสามารถใช้ในการรันคำสั่งใด ๆ
ls | echo
จะทำอะไร? ทำไมไม่เพียงแค่ใช้ls
?