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)
Bash (shopt -s extglob
세트) 또는rm ^notes.txt
Zsh (withEXTENDED_GLOB
) 등입니다.