stdin과 명령 행 인수의 성능 차이


11

일부 명령의 경우 특정 입력을 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
  1. 그들의 공연에 대한 일반적인 규칙이 있는지 궁금합니다. 즉, 어느 것이 가장 효율적이고 어느 것이 가장 적습니까?
  2. 파이프보다 항상 리디렉션이 더 낫습니까?

1
이 (중복 된) 질문을하는 모든 사람들이 운동으로 자신의 껍질을 처음부터 작성하기를 바랍니다.
alex

1
"감사합니다!"를 사용하지 마십시오 당신의 질문에. 감사를 표하기 위해 답변을 투표하십시오.
alex

@Alex : 이것이 속임수 인 경우 복제본에 링크하면 닫을 수 있습니다. 일반적으로 중복 된 질문에 대답하지 말고 중재자의주의를 끌기 위해 플래그를 지정하십시오.
Caleb

1
@ alex : 내 자신의 쉘을 작성하는 방법을 어디서 배울 수 있습니까?
Tim

@ Caleb : 지난 달에 2 ~ 3 회 정도 질문을 받았다고 확신합니다. 링크가 편리하지 않습니다 :-p
alex

답변:


6

cat file | command구문은 고려 의 쓸모없는 사용Cat . 모든 옵션 중에서 커널에서 다른 프로세스를 생성해야하기 때문에 성능이 저하됩니다. 그러나 이것이 큰 그림으로 드러날 수도 있지만 다른 양식에는없는 오버 헤드입니다. 이것은 다음과 같은 질문에 대해 다루어졌습니다 : 불필요한 고양이를 걱정해야합니까?

다른 두 형식 간에는 성능 차이가 거의 없습니다. STDIN은 프로세스가 다른 것과 마찬가지로 열고 읽어야하는 특수 파일 노드입니다. STDIN 대신 파일 이름을 전달하면 다른 파일이 열립니다.

차이점은 원하는 기능 / 유연성에 있습니다.

  • 파일 이름을 프로그램에 전달하면 입력 파일을 찾을 수있었습니다. 이것은 프로그램에 중요하거나 중요하지 않을 수 있지만 스트림을 검색 할 수있는 경우 일부 작업이 가속화 될 수 있습니다.
  • 실제 입력 파일을 알면 프로그램이 잠재적으로 파일에 쓸 수 있습니다. 예를 들어 sed -i내부 편집의 경우. (참고 :이 장면 뒤에 새 파일을 만들어야하기 때문에 다른 리디렉션보다 성능이 향상되지는 않지만 편리한 단계입니다.)
  • 셸 리디렉션을 사용하면 여러 파일을 연결하거나 프로세스 리디렉션을 사용할 수 있습니다. sed [exp] < file1 file2또는 심지어 sed [exp] < <(grep command). 이 사용 사례에 대한 자세한 내용은이 질문에서 찾을 수 있습니다. 프로세스 대체 및 파이프

프로세스 대체는 결과를 파이프하지 않아도 작동해야합니다. ( 쉘 지원없이 자체적으로 완벽하게 열 수있는 명령 길이의 명명 된 임시 파일을 생성하기 때문에) sed [exp] < <(grep command)제대로 작동 합니다 . sed [exp] <(grep command)<(grep command)sed
ShadowRanger

2
  1. command file그냥 파일을 열고 그때부터와 같이 작동 한다고 가정하면 stdin차이는 거의 없습니다. 쉘 리디렉션을 사용하면 명령 바이너리 자체와 달리 파일을 미리 엽니 다 (쉘 않습니다).

  2. 우리가 cat file | commandvs command <file에 대해 이야기하고 있다면 후자가 선호됩니다. 둘 사이의 성능 차이는 크지 않지만 전자는 불필요하게 복잡합니다 (처리량이 제한된 파이프의 추가 프로세스 및 공유 메모리 버퍼). 또한 seek파일 포인터 위치를 임의로 변경할 수는 없습니다 . 파이프, 일반 파일로 할 수 있습니다. seek입력 파일에서 -ing이 가능한 경우 일부 명령이보다 효율적인 알고리즘을 사용할 수 있습니다.


명령이 비 순차적 액세스를 수행 할 수 있기 때문에 명령 파일이 <명령보다 선호된다고 말할 수 있습니다.
user606723

그리고 무엇으로 그렇게하지 못하게 <file합니까? 포인트는 입력 파일 이름을 사용하여 출력 파일 이름을 강하게 도출하는 데 유효합니다 (예 : gzip fileproduce) file.gz.
alex

내부적으로 리디렉션이 어떻게 작동하는지 이해할 수 없습니다. 12GB 영화를 mplayer / vlc로 리디렉션 한 다음 끝으로 건너 뜁니다. 이 경우 정확히 어떻게됩니까?
user606723

1
셸은 파일을 열고 파일 설명자를 상속하는 하위 프로세스를 분기합니다. 갈래 과정 closestdin전화를 걸고 dup열린 파일 기술자에, 그것은 이전을 대체 할 수 있도록 stdin그 사이에는 차이가 없습니다 뷰의 동영상 플레이어의 관점에서 (대부분의 경우 청각 장애의 일종이었다.)에있는 그것의 이름으로 파일을 열 플레이어 자체. 파일 디스크립터는 두 시나리오 모두에서 찾을 수 있으므로 끝으로 건너 뛸 때 사용자가 감지 할 수있는 차이는 없습니다.
alex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.