คุณกำลังสับสนกับอินพุตที่แตกต่างกันสองประเภท: STDIN และอาร์กิวเมนต์ อาร์กิวเมนต์คือรายการของสตริงที่จัดเตรียมให้กับคำสั่งในขณะที่เริ่มต้นโดยปกติแล้วจะระบุไว้หลังจากชื่อคำสั่ง (เช่นecho these are some arguments
หรือrm file1 file2
) ในทางกลับกัน STDIN เป็นกระแสข้อมูลของไบต์ (บางครั้งข้อความบางครั้งไม่) ที่คำสั่งสามารถ (เป็นทางเลือก) อ่านหลังจากเริ่มต้น นี่คือตัวอย่างบางส่วน (โปรดทราบว่าcat
สามารถรับอาร์กิวเมนต์หรือ STDIN ได้ แต่ทำสิ่งต่าง ๆ กับมัน)
echo file1 file2 | cat # Prints "file1 file2", since that's the stream of
# bytes that echo passed to cat's STDIN
cat file1 file2 # Prints the CONTENTS of file1 and file2
echo file1 file2 | rm # Prints an error message, since rm expects arguments
# and doesn't read from STDIN
xargs
สามารถคิดเป็นการแปลงอินพุตสไตล์ STDIN เป็นอาร์กิวเมนต์:
echo file1 file2 | cat # Prints "file1 file2"
echo file1 file2 | xargs cat # Prints the CONTENTS of file1 and file2
echo
จริงๆแล้วจะตรงกันข้ามกันมากขึ้นหรือน้อยลง: มันแปลงอาร์กิวเมนต์เป็น STDOUT (ซึ่งสามารถถูกไพพ์ไปยัง STDIN ของคำสั่งอื่น ๆ ):
echo file1 file2 | echo # Prints a blank line, since echo doesn't read from STDIN
echo file1 file2 | xargs echo # Prints "file1 file2" -- the first echo turns
# them from arguments into STDOUT, xargs turns
# them back into arguments, and the second echo
# turns them back into STDOUT
echo file1 file2 | xargs echo | xargs echo | xargs echo | xargs echo # Similar,
# except that it converts back and forth between
# args and STDOUT several times before finally
# printing "file1 file2" to STDOUT.
ls | grep -v "notes.txt" | xargs rm
ในการลบทุกอย่างยกเว้นnotes.txt
หรือโดยทั่วไปไม่เคยแยกls
เอาท์พุท คำสั่งของคุณจะแตกถ้าไฟล์เดียวมีช่องว่างตัวอย่างเช่น วิธีที่ปลอดภัยมากขึ้นจะเป็นrm !(notes.txt)
ในทุบตี (กับshopt -s extglob
ชุด) หรือrm ^notes.txt
ใน zsh (มีEXTENDED_GLOB
) เป็นต้น