"규칙"은 없습니다. 일부 프로그램은 STDIN에서 입력을 받고 일부는 그렇지 않습니다. 프로그램이 STDIN에서 입력을받을 수있는 경우 파이프되지 않을 수 있습니다.
일반적으로 프로그램의 기능에 대해 생각하여 프로그램이 입력을 받을지 여부를 알 수 있습니다. 프로그램의 작업이 어떻게 든 조작하는 경우 내용을 파일 (예를 들어,의 grep
, sed
, awk
등), 그것은 일반적으로 STDIN에서 입력을 받아. 그 작업이 파일 자체 (예를 들어 조작 할 경우 mv
, rm
, cp
) 또는 프로세스 (예를 들어 kill
, lsof
) 또는 무언가에 대한 반환 정보에 (예 top
, find
, ps
) 그것은하지 않습니다.
그것에 대해 생각하는 또 다른 방법은 인수와 입력의 차이입니다. 예를 들면 다음과 같습니다.
mv foo bar
위의 명령 mv
에는 입력이 없습니다. 주어진 것은 두 가지 주장입니다. 파일 중 하나에있는 내용을 알거나 신경 쓰지 않으며, 그 파일이 인수라는 것을 알고 조작해야합니다.
반면에
sed -e 's/foo/bar/' < file
--- -- ------------ ----
| | | |-> input
| | |------------> argument
| |--------------------> option/flag/switch
|------------------------> command
여기 sed
에는 인수뿐만 아니라 입력이 주어졌습니다. 입력이되므로 STDIN에서 읽어서 파이프 할 수 있습니다.
인수가 입력 이 될 때 더 복잡해집니다 . 예를 들어
cat file
여기 file
에 주어진 인수가 cat
있습니다. 정확하게 말하면 파일 이름 file
이 인수입니다. 그러나 cat
파일의 내용을 조작하는 프로그램이므로 입력 내용은 내부에 file
있습니다.
strace
프로세스에서 수행 한 시스템 호출을 추적하는 프로그램 인을 사용하여 설명 할 수 있습니다 . cat foo
를 통해 실행 strace
하면 파일 foo
이 열린 것을 볼 수 있습니다 .
$ strace cat foo 2| grep foo
execve("/bin/cat", ["cat", "foo"], [/* 44 vars */]) = 0
open("foo", O_RDONLY)
위의 첫 번째 줄은 프로그램 /bin/cat
이 호출되었고 그 인수가 cat
이고 foo
(첫 번째 인수는 항상 프로그램 자체 임) 보여줍니다. 나중에 인수 foo
가 읽기 전용 모드로 열립니다. 자, 이것을 이것과 비교하십시오
$ strace ls foo 2| grep foo
execve("/bin/ls", ["ls", "foo"], [/* 44 vars */]) = 0
stat("foo", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
lstat("foo", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
write(1, "foo\n", 4foo
여기 또한, ls
자신을 데리고 foo
인수로. 그러나 open
호출 이 없으며 인수는 입력으로 처리되지 않습니다. 대신 ls
시스템 stat
라이브러리 ( stat
명령 과 동일하지 않음 )를 호출 하여 파일에 대한 정보를 얻습니다 foo
.
요약하면, 실행중인 명령이 입력을 읽는다면 파이프로 연결할 수 있으며 그렇지 않은 경우 파이프로 연결할 수 없습니다.
pgrep
,pkill
및killall
명령을 살펴볼 수 있습니다 .