Bạn đang nhầm lẫn hai loại đầu vào rất khác nhau: STDIN và đối số. Đối số là một danh sách các chuỗi được cung cấp cho lệnh khi nó bắt đầu, thường bằng cách chỉ định chúng sau tên lệnh (ví dụ echo these are some arguments
hoặc rm file1 file2
). STDIN, mặt khác, là một luồng byte (đôi khi là văn bản, đôi khi không) mà lệnh có thể (tùy chọn) đọc sau khi nó bắt đầu. Dưới đây là một số ví dụ (lưu ý cat
có thể lấy đối số hoặc STDIN, nhưng nó thực hiện những điều khác nhau với chúng):
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
có thể được coi là chuyển đổi đầu vào kiểu STDIN thành đối số:
echo file1 file2 | cat # Prints "file1 file2"
echo file1 file2 | xargs cat # Prints the CONTENTS of file1 and file2
echo
thực tế thì ít nhiều ngược lại: nó chuyển đổi các đối số của nó thành STDOUT (có thể được dẫn đến một số STDIN của lệnh khác):
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
để loại bỏ tất cả mọi thứ trừnotes.txt
, hoặc nói chung, không bao giờ phân tíchls
đầu ra . Lệnh của bạn sẽ bị hỏng nếu một tệp duy nhất chứa một khoảng trắng chẳng hạn. Cách an toàn hơn sẽ làrm !(notes.txt)
Bash (vớishopt -s extglob
set) hoặcrm ^notes.txt
Zsh (withEXTENDED_GLOB
), v.v.