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
세 가지 요소가 포함됩니다.
cat someFile
- 관로
|
foo
지금 무슨 일이 일어나는거야:
cat
someFile
그것이 무엇인지 알기 때문에 무엇을 읽어야 하는지 알고 있으므로 Sales에서 세부 사항을 알려줍니다. 즉,someFile
여기에 매개변수가 있으며 모든 매개변수는 호출된 애플리케이션에 전달됩니다.파이프를 사용하면 셸이 하위 셸을 포크하고 그 안에서 프로세스를 시작할 수 있을 뿐만 아니라 하위 셸과 프로세스를 정렬하고 특히 입력과 출력을 설정할 수 있습니다. 이것이
foo
에서 입력을 받는 방법 입니다cat
.foo
이름은cat
이전과 같습니다. 그러나 두 번째 단계(실제로는 셸의 첫 번째 단계) 이후에는 파이프 이름이 입력foo
됩니다 .cat
답변3
두 가지 명령을 작성했습니다: cat someFile
및 foo
. 첫 번째 명령은 someFile
이를 읽고 쓰고 의 출력 standard output
으로 리디렉션 해야 합니다 pipe
. 다음 명령은 여기에서 데이터를 읽고 standard input
해당 데이터가 로 리디렉션됩니다 pipe
.
표준 입력, 표준 출력 및 표준 오류는 Linux의 기본 용어이며 리디렉션 및 파이프는 프로그램 간 데이터 흐름에 대한 가장 강력한 원칙입니다. Linux 명령줄의 기본 사항을 알아보려면 다음 용어를 찾아보세요.