입력 리디렉션은 언제 사용해야합니까? comment in

다음 두 명령을 사용하여 동일한 결과를 얻었습니다.

[root@localhost ~]# grep line comments
The line should start with a single quote to comment in VB scripting.
Double slashes in the beginning of the line for single line comment in C.
[root@localhost ~]#

[root@localhost ~]# grep line <comments
The line should start with a single quote to comment in VB scripting.
Double slashes in the beginning of the line for single line comment in C.
[root@localhost ~]#

이 두 가지 중 하나가 서로 접근하면 장단점을 설명해 주시겠습니까?



답변

보내는 사람 man grep(데비안) 페이지 :

기술

   grep  searches the named input FILEs (or standard input if no files are
   named, or if a single hyphen-minus (-) is given as file name) for lines
   containing  a  match to the given PATTERN.  By default, grep prints the
   matching lines.

첫 번째 경우 grep파일을 엽니 다. 두 번째로, 쉘은 파일을 열고 표준 입력에 할당하며 grep, grep파일 이름 인수가 전달되지 않으면 표준 입력을 grep해야한다고 가정합니다.

1의 장점

  • grep 하나 이상의 파일을 grep 할 수 있습니다 ¹.
  • grep각 발생 line이 발견 된 파일 이름을 표시 할 수 있습니다 .

2의 장점

  • 파일을 열 수없는 경우, 쉘은보다 관련성있는 정보 (스크립트의 줄 번호와 같은)와보다 일관된 방식으로 (쉘이 다른 명령을 위해 파일을 열도록 허용 한 경우) 오류를 반환합니다. grep그것을 엽니 다. 그리고 파일을 열 수 없으면 grep호출되지 않습니다 (일부 명령의 grep경우 큰 차이를 만들 수 있음).
  • grep line < in > out경우, in캔을 열 수 없습니다, out만들거나 절단되지 않습니다.
  • 비정상적인 이름 (예 :으로 -시작하는 파일 이름 -) ²이 있는 일부 파일에는 문제가 없습니다 .
  • 외관 : <file원하는 <in grep line >out경우 명령 줄의 아무 곳에 나 배치 하여 명령 흐름을보다 자연스럽게 표시 할 수 있습니다.
  • cosmetic : GNU grep에서는 다음과 같이 파일 이름 대신 일치하는 줄 앞에 사용할 레이블을 선택할 수 있습니다.

    <file grep --label='Found in file at line' -Hn line
    

성능면에서 파일을 열 수 없으면 grep리디렉션 을 사용할 때 실행을 저장 하지만 그렇지 않으면 grep큰 차이가 없습니다.

리디렉션을 사용하면에 추가 인수를 전달하지 않아도 grep되므로 grep인수 구문 분석이 약간 쉬워집니다. 반면에, 쉘은 dup2()파일 디스크립터 0에 대한 파일 디스크립터에 대한 추가 시스템 호출을 적어도 필요 로합니다.

에서 { grep -m1 line; next command; } < file, grep(여기에 GNU 것은 grep) 할 것 seek()(가) 그래서 그냥 일치하는 행 다음에 백업 next command파일의 나머지 부분을보고 (이 또한 파일이 시크인지 여부를 결정해야합니다). 다시 말해서, stdin 내의 위치는의 다른 grep출력 중 하나입니다 . 을 사용 grep -m1 line file하면이를 최적화 할 수 있습니다 grep.


노트

¹를 사용 zsh하면 다음을 수행 할 수 있습니다.

grep line < file1 < file2

그러나 cat file1 file2 | grep line( cat유틸리티 를 호출하지 않고) 동등한 기능을 수행 하므로 효율성이 떨어 지므로 첫 번째 파일이 줄 바꿈 문자로 끝나지 않고 패턴이 발견 된 파일을 알려주지 않으면 혼동을 일으킬 수 있습니다.

² ksh93bash같은 경우 /dev/tcp/host/port(및 /dev/fd/x일부 시스템에 bash) 리디렉션 대상으로 사용될 때 셸이 실제로 파일 시스템에서 파일을 여는 대신 특수 목적으로 가로채는 파일이 있습니다 (일반적으로 해당 파일은 파일 시스템에 존재하지 않습니다). /dev/stdin-의해 인식되는 것과 동일한 목적을 수행 grep하지만 적어도 여기에는 네임 스페이스가 더 적절합니다 ( -모든 디렉토리에서 파일을 만들 수는 있지만 관리자 만 파일을 만들 수 /dev/tcp/host/port있으며 관리자는 더 잘 알고 있어야 함).


답변

StephaneChazelas의 답변이 포함 grep(1)되어 있으며 대부분의 유닉스 계보 명령은 그런 식으로 작동하지만 전부는 아닙니다. 표준 입력 (키보드,을 통해 경로 재 지정된 파일 < file또는 다른 명령 (예 : 어리석은 예제 ls * | grep '^ab*c$')에 의해 파이프 된 출력 ) 또는 인수와 같은 파일 로 읽는 것이 표준 grep comment file1 file2 file3입니다. 일부 명령 -은 이름 이 지정된 파일 이 표준 입력 이라는 규칙을 사용 하므로 생성 된 모든 항목 과 뒤에 make-middle | cat head - tail스트림을 가져올 수 있습니다 . 이것은 명령 사용에 유연성을 부여하기 위해 의도적으로 설계된 것입니다.headgen-middletail

어떤게 더 좋아? 작동하는 cmd file한보다 짧습니다 cmd < file. 쉘이 파일 frobbing ( )을 수행하는 쉘 과 자체적으로 수행하는 명령 간에는 시간에 약간의 차이 가있을 수 <있지만 하루 종일 다른 작업을 수행하지 않으면 눈에 띄지 않을 수 있습니다. Stephane의 답변에 언급 된 전문가와 같은 고려 사항에 달려 있습니다.


답변