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

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

동일한 결과를 생성하는 다음 두 명령을 사용하고 있습니다.

[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 ~]#

이 두 가지 방법이 서로 대체 가능한 경우 장점/단점을 설명해 주세요.

답변1

man grep페이지 에서 (Debian의 경우):

설명하다

   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할 수 있습니다1.
  • grep파일 이름이 나타날 때마다 표시될 수 있습니다 line.
  • grepfadvise(POSIX_FADV_SEQUENTIAL)열려 있는 파일 설명자에 대해 작업을 수행하는 것이 가능합니다²(그러나 구현에 대해서는 알지 못합니다).

2의 장점:

  • 파일을 열 수 없는 경우, 쉘은 보다 관련 있는 정보(예: 스크립트의 행 번호)가 포함된 오류를 반환하고 보다 일관된 방식으로 파일을 엽니다(쉘이 다른 명령을 위해 파일을 열도록 허용한 경우). ) grep. 파일을 열 수 없으면 grep호출조차 되지 않습니다(일부 명령의 경우 - 아닐 수도 있지만 grep- 큰 영향을 미칠 수 있음).

  • grep line < in > out, 열 수 없는 경우 생성 in되거나 out잘리지 않습니다.

  • -특이한 이름(예: 또는 로 시작하는 파일 이름)을 가진 일부 파일에는 문제가 없습니다 -.

  • 장식: 원하는 경우 <file명령줄의 아무 곳에나 배치하여 명령 흐름을 보다 자연스럽게 표시할 수 있습니다.<in grep line >out

  • 외관: GNU를 사용하면 grep다음과 같이 파일 이름뿐만 아니라 일치하는 줄 앞에 사용할 태그를 선택할 수 있습니다.

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

성능 측면에서는 grep파일을 열 수 없는 경우 리디렉션을 사용할 때 실행을 저장할 수 있지만 그 외에는 grep큰 차이가 없을 것으로 예상됩니다.

리디렉션을 사용하면 추가 매개변수를 에 전달할 필요가 없으므로 매개변수 구문 분석이 약간 더 쉬워 grep집니다 grep. 반면, 쉘은 파일 dup2()설명자를 파일 설명자 0으로 전송하기 위해 파일 설명자에 대해 (적어도) 추가 시스템 호출을 수행해야 합니다.

(여기서는 GNU ) 파일의 나머지 부분을 볼 수 있도록 일치하는 줄 뒤로 돌아가기 를 원할 { grep -m1 line; next command; } < file것입니다 (파일이 검색 가능한지 여부도 결정해야 합니다). 즉, stdin의 위치는 또 다른 출력입니다. 이를 통해 이를 최적화할 수 있으며 걱정할 것이 하나 줄어듭니다.grepgrepseek()next commandgrepgrep -m1 line filegrep


노트

이를 사용하여 zsh다음을 수행할 수 있습니다.

grep line < file1 < file2

그러나 이는 유틸리티를 cat file1 file2 | grep line호출하지 않는 cat것과 같기 때문에 효율성이 떨어지며 첫 번째 파일이 개행으로 끝나지 않고 어떤 파일에서 패턴이 발견되었는지 알려주지 않으면 혼란을 일으킬 수 있습니다.

grep² 이는 I/O 스케줄러가 데이터를 읽는 방법과 같은 더 많은 정보를 바탕으로 결정을 내릴 수 있도록 파일을 순서대로 읽도록 시스템에 알려줍니다 . grep이걸 할 수 있어내 자신의fd, 하지만 fd 0에서 이 작업을 수행하는 것은 잘못된 것입니다.빌리다fd와 같은 호출자로부터 (또는 오히려파일 설명 열기참조)는 나중에 또는 동시에 비순차 읽기에 사용할 수 있습니다. 그러나 실제로는 GNU가 sort여전히 이 작업을 수행한다는 것을 알 수 있습니다.

ksh933 및 (및 의 일부 시스템 ) 의 경우 리디렉션 대상에서 사용될 때 실제로 파일 시스템에서 파일을 여는 대신 특수 목적으로 셸에서 가로채는 bash유사한 파일이 있습니다 . 이러한 파일은 파일 시스템에 존재하지 않습니다.) 식별된 목적과 동일 하지만 적어도 여기서는 네임스페이스가 더 적합합니다(누구나 모든 디렉터리에 이름이 지정된 파일을 만들 수 있지만 관리자만 이름이 지정된 파일을 만들 수 있으므로 관리자는 더 잘 알아야 합니다)./dev/tcp/host/port/dev/fd/xbash/dev/stdin-grep-/dev/tcp/host/port

답변2

StephaneChazelas의 답변은 이를 다루고 grep(1)있으며 대부분의 Unix 계보 명령은 이런 방식으로 작동하지만 전부는 아닙니다. 표준 읽기 방법은 표준 입력(키보드, 리디렉션을 통한 파일 < file또는 다른 명령의 파이프된 출력, 어리석은 예 ls * | grep '^ab*c$') 또는 인수로 제공된 파일(예: )에서 읽는 것입니다 grep comment file1 file2 file3. 일부 명령은 명명된 파일이 -표준 입력이라는 규칙을 사용하므로 생성된 모든 항목을 make-middle | cat head - tail사용하여 스트림을 가져온 다음 명령을 보다 유연하게 사용할 수 있도록 설계되었습니다.headgen-middletail

어느 것이 더 낫습니까? 작동하는 한 다음 cmd file보다 짧을 cmd < file수 있습니다.매우 작은쉘이 파일을 frobbing( ) <하는 것과 명령 자체가 이를 수행하는 사이의 시간 차이는 있지만 하루 종일 다른 작업을 하지 않는 한 눈에 띄지 않을 것입니다. 이는 Stephen의 답변에 언급된 장점과 같은 고려 사항에 따라 달라집니다.

관련 정보