프로그램은 파이프에서 무엇을 읽을지 어떻게 알 수 있나요? [복사]

프로그램은 파이프에서 무엇을 읽을지 어떻게 알 수 있나요? [복사]

Unix 명령줄 프로그램은 어떤 파일을 읽을지 어떻게 알 수 있나요?

예를 들어:

 cat someFile | foo

프로그램은 foo읽을 파일을 어떻게 알 수 있으며, 디스크에서 해당 파일을 열고 읽는 작업을 담당하는 프로세스는 무엇입니까?

답변1

foo어떤 파일을 읽어야 할지 모르며, (아마도) 표준 입력 스트림에서 읽기만 합니다. 이 데이터 스트림은 쉘을 통해 명령의 표준 출력 스트림에 연결됩니다 cat. 이 "관리 파이프"는 두 프로세스(동시에 실행됨)를 시작할 때 쉘에 의해 수행됩니다.

질문의 예에서는 cat읽기 위해 파일을 열고, 파일을 읽고, 데이터를 표준 출력으로 전달합니다.

"결과를 어디에 쓸지 어떻게 알 수 있나요?"라고 질문할 수도 있습니다. cat대답은 쉘을 통해 명령의 표준 입력 스트림에 연결된 표준 출력 스트림에 쓴다는 것입니다 foo. 마찬가지로 foo명령에 대한 추가 파이프나 리디렉션이 없기 때문에 명령의 표준 출력 스트림은 셸을 통해 터미널에 연결됩니다.


당신이 보여주는 파이프라인은,

cat someFile | foo

기능적으로는 다음과 같습니다.

foo <somefile

cat실제로는 필요하지 않기 때문에 여기에서 제거했습니다 . 쉘은 표준 입력 스트림을 foo주어진 파일에 연결하므로 효과는 동일합니다( 표준 입력 스트림에서 읽을 foo수 있음 ).somefile

마지막 명령에서는 foo여전히 이름이 지정된 파일에서 데이터를 읽는지 확실하지 않습니다 somefile. 또한 더 이상 의 출력을 읽지 않는다는 사실도 모릅니다 cat. 이전과 마찬가지로 표준 입력 스트림을 읽습니다.

이제 쉘은 somefile읽기 위해 파일을 열지만 파일에서 아무것도 읽지 않고 표준 입력 스트림을 foo읽기 위해 열린 파일에 연결합니다.


foo이 명령이 무엇을 하는지, 실제로 작동하는지 알 수 없다는 점에 유의하세요.아무것표준 입력 스트림을 사용하거나, 명령줄에서 파일 이름을 읽어야 하는 경우 사용하세요. 이 정보는 프로그램 매뉴얼에서 찾을 수 있습니다 foo.

foo실제 상황에서필요명령줄에 경로 이름을 지정하여 특정 파일을 읽으라는 지시를 받으려면 다음을 사용할 수 있습니다.

foo somefile

이제 foo파일을 열고 읽는 일을 담당하게 됩니다.

파일을 어떤 방식으로든 처리해야 하는 경우(" cat"는 에서 읽은 데이터를 실제로 수정하는 더 복잡한 프로세스라고 가정 somefile):

cat somefile >newfile
foo newfile
rm newfile

즉, 파일을 처리하고 결과를 새 임시 파일에 저장한 다음 임시 파일 이름을 에 전달합니다 foo. 그런 다음 임시 파일을 삭제합니다.

또는 프로세스 대체를 이해하는 쉘을 사용하십시오(예 bash: ).

foo <( cat somefile )

여기서 쉘은 출력이 cat somefile임시 파일(또는 명명된 파이프, 중요하지 않음)에 기록되도록 준비하고 프로세스 대체 대신 해당 데이터의 경로 이름이 삽입됩니다 <( ... ). foo그런 다음 파일로 열어서 읽으세요.

마지막 예에서는 cat원본 파일이 열리고 읽혀지며, foo쉘에서 제공하는 모든 경로 이름(발견된 출력 cat)이 열리고 읽혀집니다.

답변2

여기에는 cat someFile | foo세 가지 요소가 포함됩니다.

  1. cat someFile
  2. 관로|
  3. foo

지금 무슨 일이 일어나는거야:

  1. catsomeFile그것이 무엇인지 알기 때문에 무엇을 읽어야 하는지 알고 있으므로 Sales에서 세부 사항을 알려줍니다. 즉, someFile여기에 매개변수가 있으며 모든 매개변수는 호출된 애플리케이션에 전달됩니다.

  2. 파이프를 사용하면 셸이 하위 셸을 포크하고 그 안에서 프로세스를 시작할 수 있을 뿐만 아니라 하위 셸과 프로세스를 정렬하고 특히 입력과 출력을 설정할 수 있습니다. 이것이 foo에서 입력을 받는 방법 입니다 cat.

  3. foo이름은 cat이전과 같습니다. 그러나 두 번째 단계(실제로는 셸의 첫 번째 단계) 이후에는 파이프 이름이 입력 foo됩니다 .cat

답변3

두 가지 명령을 작성했습니다: cat someFilefoo. 첫 번째 명령은 someFile이를 읽고 쓰고 의 출력 standard output으로 리디렉션 해야 합니다 pipe. 다음 명령은 여기에서 데이터를 읽고 standard input해당 데이터가 로 리디렉션됩니다 pipe.

표준 입력, 표준 출력 및 표준 오류는 Linux의 기본 용어이며 리디렉션 및 파이프는 프로그램 간 데이터 흐름에 대한 가장 강력한 원칙입니다. Linux 명령줄의 기본 사항을 알아보려면 다음 용어를 찾아보세요.

관련 정보