일부 명령의 경우 특정 입력을 stdin 또는 명령 행 인수로 지정할 수 있습니다.
구체적으로, 가정 command
의 입력 및 커맨드 라인 인수로 파일명 stdin을 취할 수 있으며 command < myfile
, cat myfile | command
그리고 command myfile
같은 결과를 얻을 수있다.
예를 들어
명령이 sed
다음과 같은 경우 :
sed s/day/night/ <myfile >new
sed s/day/night/ myfile >new
cat myfile | sed s/day/night/ >new
명령이 cat
다음과 같은 경우 :
cat < myfile
cat myfile
- 그들의 공연에 대한 일반적인 규칙이 있는지 궁금합니다. 즉, 어느 것이 가장 효율적이고 어느 것이 가장 적습니까?
- 파이프보다 항상 리디렉션이 더 낫습니까?
답변
cat file | command
구문은 고려 의 쓸모없는 사용Cat
. 모든 옵션 중에서 커널에서 다른 프로세스를 생성해야하기 때문에 성능이 저하됩니다. 그러나 이것이 큰 그림으로 드러날 수도 있지만 다른 양식에는없는 오버 헤드입니다. 이것은 다음과 같은 질문에 대해 다루어졌습니다 : 불필요한 고양이를 걱정해야합니까?
다른 두 형식 간에는 성능 차이가 거의 없습니다. STDIN은 프로세스가 다른 것과 마찬가지로 열고 읽어야하는 특수 파일 노드입니다. STDIN 대신 파일 이름을 전달하면 다른 파일이 열립니다.
차이점은 원하는 기능 / 유연성에 있습니다.
- 파일 이름을 프로그램에 전달하면 입력 파일을 찾을 수있었습니다. 이것은 프로그램에 중요하거나 중요하지 않을 수 있지만 스트림을 검색 할 수있는 경우 일부 작업이 가속화 될 수 있습니다.
- 실제 입력 파일을 알면 프로그램이 잠재적으로 파일에 쓸 수 있습니다. 예를 들어
sed -i
내부 편집의 경우. (참고 :이 장면 뒤에 새 파일을 만들어야하기 때문에 다른 리디렉션보다 성능이 향상되지는 않지만 편리한 단계입니다.) - 셸 리디렉션을 사용하면 여러 파일을 연결하거나 프로세스 리디렉션을 사용할 수 있습니다.
sed [exp] < file1 file2
또는 심지어sed [exp] < <(grep command)
. 이 사용 사례에 대한 자세한 내용은이 질문에서 찾을 수 있습니다. 프로세스 대체 및 파이프
답변
-
command file
그냥 파일을 열고 그때부터와 같이 작동 한다고 가정하면stdin
차이는 거의 없습니다. 쉘 리디렉션을 사용하면 명령 바이너리 자체와 달리 파일을 미리 엽니 다 (쉘 않습니다). -
우리가
cat file | command
vscommand <file
에 대해 이야기하고 있다면 후자가 선호됩니다. 둘 사이의 성능 차이는 크지 않지만 전자는 불필요하게 복잡합니다 (처리량이 제한된 파이프의 추가 프로세스 및 공유 메모리 버퍼). 또한seek
파일 포인터 위치를 임의로 변경할 수는 없습니다 . 파이프, 일반 파일로 할 수 있습니다.seek
입력 파일에서 -ing이 가능한 경우 일부 명령이보다 효율적인 알고리즘을 사용할 수 있습니다.