"규칙"은 없습니다. 일부 프로그램은 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명령을 살펴볼 수 있습니다 .