리눅스 파이프 심볼“|”은 무엇을합니까? [복제]


23

다음은 폴더의 파일을 역순으로 정렬하는 명령입니다.

ls | sort -r

|해당 명령 의 기호는 무엇을 합니까?

내가 정말로 찾고있는 것은 Linux 초보자를위한 파이프에 대한 높은 수준의 (알기 쉬운) 설명입니다. 수퍼 유저의 파이프에 대한 다른 질문을 보았지만 간단한 용어로 수행하는 작업과 리디렉션 ( >또는 <기호) 과 다른 점을 설명하는 대답을 이끌어내는 것은 없습니다 .


7
이것은 리눅스 (커널)와 관련이 없습니다. 파이프는 일반적으로 입출력을 재지 정하는 수단이며, bash와 같은 쉘에서는 다르지 않습니다. a의 특별한 점 |은 이름을 사용하지 않는다는 것입니다. l-hand 명령의 출력은 파이프의 r-hand 측에있는 명령의 입력으로 직접 전달됩니다.
Andon M. Coleman

이 주제에 관한 역사에 대한 정보는 linfo.org/pipe.html
Fredrik Pihl

ls -1r(첫 번째 인수에 유의하십시오)와 비슷한 결과를 생성해야합니다 ls | sort -r.
Ivan Chau

파이프는 한 명령의 출력을 가져 와서 다음 명령에 사용할 수있게합니다. 예를 들어, 할 수 있습니다 cat /somefile | grep cool. 이것은 somefile의 출력을 가져 와서 grep에 사용 가능하게하고 grep은 cool이라는 단어가있는 모든 행을 인쇄합니다.
JohnDoea

답변:


26

다음은 새로운 사용자를 돕기 위해 단순화 된 것입니다.

먼저, 표준 입력 및 표준 출력의 개념을 이해해야합니다.

Linux 및 기타 UNIX 유사 운영 체제에서 각 프로세스에는 표준 입력 ( stdin) 및 표준 출력 ( stdout)이 있습니다. 일반적인 상황은 stdin키보드이고 stdout화면 또는 터미널 창입니다.

따라서을 실행하면에 ls출력됩니다 stdout. 다른 작업을 수행하지 않으면 화면이나 터미널 창으로 이동하여 볼 수 있습니다.

이제 일부 Linux 명령은 사용자와 상호 작용하고이를 사용 stdin하여 텍스트 편집기 중 하나입니다. 그것은 읽 stdin일을, 키 입력을 수용 할 다음에 물건을 씁니다 stdout.

그러나 대화식으로 작동하지 않지만 많은 데이터를 원하는 비 대화식 또는 "필터"명령도 있습니다. 이 명령은 모든 것을 stdin가지고 무언가를 한 다음에 던질 것입니다.stdout

du디스크 사용을 나타내는- 라는 또 다른 명령을 살펴 보겠습니다 . du /usr예를 들어, stdout다른 Linux 명령과 마찬가지로 해당 디렉토리의 모든 파일 목록을 인쇄 합니다. 크기는 다음과 같습니다.

# du /usr
2312    /usr/games
124     /usr/lib/tc
692     /usr/lib/rygel-1.0
400     /usr/lib/apt/methods
40      /usr/lib/apt/solvers
444     /usr/lib/apt
6772    /usr/lib/gnash

박쥐를 바로 알 수 있듯이, 그것은 분류되지 않았으며 아마 크기 순서대로 정렬하고 싶을 것입니다.

sort많은 것들을 가져 와서 stdin정렬 하는 "필터"명령 중 하나입니다 .

우리가 이렇게하면 :

# du /usr | sort -nr

우리는 이것을 얻습니다.

4213348 /usr
2070308 /usr/lib
1747764 /usr/share
583668  /usr/lib/vmware
501700  /usr/share/locale
366476  /usr/lib/x86_64-linux-gnu
318660  /usr/lib/libreoffice
295388  /usr/lib/vmware/modules
290376  /usr/lib/vmware/modules/binary
279056  /usr/lib/libreoffice/program
216980  /usr/share/icons

"파이프" stdout가 하나의 명령을 stdin다른 명령과 연결하는 것을 볼 수 있습니다 . 일반적으로 명령의 출력을 필터링, 정렬 또는 조작하려는 경우와 같은 상황에서 사용합니다. 여러 필터 유형 명령을 통해 출력을 처리하려는 경우 캐스케이드 연결될 수 있습니다.

sort스스로 입력 해도 여전히에서 읽으려고 시도합니다 stdin. stdin이 키보드에 연결되어 있기 때문에 Ctrl-D를 누를 ​​때까지 입력을 처리하고 처리합니다. 실제로 대화식으로 사용하기위한 것이 아니기 때문에 메시지가 표시되지 않습니다.

프로그램 stdin이 대화식 인지 아닌지 알 수 있으므로 일부 프로그램은 자체적으로 또는 파이프 끝에서 발행하면 다르게 작동 할 수 있습니다.

또한와 같이 대화식으로 만 작동하는 프로그램을 파이핑하면 vi시간이 나빠질 수 있습니다.

파이프는 데이터를 한 위치에서 다른 위치로 저장하지 않고 한 명령에서 다음 명령으로 섞 었다는 점에서 리디렉션과 다릅니다. 따라서 위의 예에서 du의 출력은 어디에도 저장되지 않습니다. 파이프를 사용하는 이유는 어떤 방식으로 명령의 출력을 처리하기 때문에 파이프로 이것을 원하지 않는 대부분의 시간이지만 tee케이크를 먹고 먹을 수 있는 명령 이 있습니다. 수신 한 stdin내용 stdout과 원하는 파일로 복사 하십시오. bash내가 모르는 앰퍼샌드 및 괄호와 관련된 일부 구문 에서이 작업을 수행 할 수도 있습니다 .


이것은 Linux 또는 POSIX에 고유하지 않습니다. Windows의 대부분 (모두?) 쉘도이 작업을 수행합니다. 그리고 아마도 다른 OS들.

Windows 의 개념을 알고 있으며 Linux의 경우 stdinstdout는 다르지만 Windows cmd.exe또는 Powershell 의 관점에서는 그리 많지는 않습니다 .
LawrenceC

어떻게 다른지 궁금합니다. 설명해 주시겠습니까? 댓글이 좋지 않은 경우 채팅에서 가능합니다.

1
Win32 프로그램에는 표준 입력 및 출력이 있습니다. 예를 들어, Win32 함수를 사용하여 프로세스의 표준 입력, 출력 또는 오류 핸들을 검색 할 수 있습니다 GetStdHandle(). 생성 된 [자식] 프로세스의 표준 스트림을 .NET으로 리디렉션하는 것도 사소한 일입니다. Win32 함수에 매핑한다고 생각합니다 (그러나 100 % 확신 할 수는 없습니다-Win32 개발자는 아닙니다).
Bob

1
아, 여기STARTUPINFO구조체 에서 적절한 매개 변수를 설정하여 Win32에 해당하는 것이 CreateProcess()있습니다.
Bob

27

출력 및 입력 리디렉션에 익숙한 경우 설명이 매우 쉽습니다.

Command1 | Command2

와 동일

Command1 > tempfile
Command2 < tempfile

그러나없이 tempfile. 의 출력은 Command1입력에 직접 연결되며 Command2전송은 메모리 내에서 수행됩니다.


틀릴 수도 있지만 파이프 구문에도 임시 파일이 있다고 생각합니다. 이름이 없습니다.
Taemyr

3
아니 그렇지 않아. 한 명령에서 다른 명령의 입력으로 출력을 파이핑 할 때는 파일 시스템 작업이 필요하지 않습니다.
Daniel B

1
DOS (및 대부분의 Windows)에서는 임시 파일 파이프에 의해 작성됩니다. * nix는 아니지만 차이점은 없습니다.
Jeremy J Starcher

이것이 정확하지 않다고 확신합니다. 프로세스 모니터는 클레임을 거부 CreateFile하거나 WriteFile거부한다고 보고 합니다. / edit : 물론 Windows 부분입니다.
Daniel B

3

실제로 파이프의 기능과>와 |의 차이점을 알고 싶다면 많은 파일이있는 디렉토리로 이동하십시오.

터미널에서 ls vs ls | more (또는 DIR 및 DIR | MORE로 Windows에서 수행)

> more를 사용하면 ls의 출력을 'more'명령으로 보내는 대신 'more'라는 파일이 생성됩니다. 따라서 누군가가 더 많은 실수를한다면 아마도 실수를하지 않을 것입니다. 더 잘 알려진 명령입니다.

<like>는 명령이 아닌 명령과 파일을 연결하는 데 사용됩니다. 그러나>가 명령의 출력을 파일로 보내는 동안 <는 파일을 명령의 입력으로 보냅니다. 나는 보통 cat file1을 사용하기 때문에 <를 거의 사용하지 않는다 | 파일의 출력을 명령으로 보냅니다.

$ grep a <file1 abc

$ 고양이 file1 | ABC를 잡다

2 개의 매개 변수가있는 grep은 grep 패턴 파일 형식입니다. 하나의 매개 변수를 가진 grep은 grep 패턴입니다. 파일의 내용을 파이프로 보내거나 <를 사용하여 파일을 보낼 수 있습니다. <를 사용하면 먼저 명령 이름을 쓴 다음 파일 이름 뒤에 <파일을 입력하십시오. 사용하는 경우 | 파일의 내용을 파이프하려면 cat file1 | 명령.

또한 많은 명령은 어쨌든 파일을 입력으로 사용하므로 cat file1 | grep a 및 grep a <file1.

15 년 전에 DOS에서 파이프 (|)와>를하고있었습니다.

방법을 요약하려면 | <와>와 다름- 파이프는 두 명령 사이에 있습니다. <와>는 명령과 파일 사이에 있습니다. >가 파일로 출력됩니다. <는 파일에서 입력됩니다.


3

파이프 문자 ( |)는 한 프로그램의 출력을 다른 프로그램의 입력에 연결합니다.

이 예에서 echo단어를 출력 hello하고, wc -c입력의 글자 수를 수행합니다

echo hello | wc -c

에코가 "hello \ n"을 출력한다고 한 번에 말해야한다고 생각합니다. OP에게 공부하라고 말하지 않고 답을 읽는 모든 사람에게 말하고 있습니다. 이 시간 낭비를 왜 곱해야합니까?
Rodrigo

의견을 보내 주셔서 감사합니다. 답변을 줄였습니다.
bbaassssiiee

2

이것을 이해하려면 직접 시도하십시오.

sort -r

이제 커서로 매달려 있고 아무것도하지 않습니다. 일부 데이터를 입력하면 어떻게됩니까?

1
2
3
5
4

아직 아무것도 없어요? 이제 Ctrl + D를 누르십시오

5
4
3
2
1

따라서 정렬은 입력 (입력 한 내용)을 사용하여 무언가를 수행하고 (정렬) 출력으로 반환합니다. ls명령은 단지 출력을 생성하고, 입력을받지 않는다. 파이프 기호는의 출력을 가져 와서 명령의 ls입력으로 공급합니다 sort.

>출력을 프로그램에 공급하지 않지만 출력을 파일로 저장합니다. <파일을 입력으로 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.