대부분 명령에 관한 많은 답변에서 STDIN과 함께 사용되는 , 등과 text-processing
같은 명령을 볼 수 있으며 단순히 파일을 열 수 있습니다.sed
awk
grep
예를 들어
$ sed -e 's|foo|bar|g' file # open file
$ sed -e 's|foo|bar|g' <file # open STDIN
또는
$ grep 'PATTERN' file # open file
$ grep 'PATTERN' <file # open STDIN
개인적으로 파일열기 방식을 항상 사용하는데, 언제 사용하고 사용하지 말아야 하는지, 그리고 차이점이 무엇인지 알고 싶습니다.
답변1
그것은 필요에 달려 있습니다. 이 경우 표준 입력의 파일 이름이나 파이프를 사용하면 차이가 있습니다.
bash-4.1$ cat /etc/passwd /etc/group | wc -l
128
bash-4.1$ wc -l /etc/passwd /etc/group
49 /etc/passwd
79 /etc/group
128 total
bash-4.1$
또한 표준 입력은 그다지 lseek(3)
강력하지 않은 경향이 있으므로 응용 프로그램에 조회할 수 있는 파일 설명자가 필요한 경우(예: 처음으로 되감기) 표준 입력을 사용하지 못할 수 있습니다.
답변2
출력에 관해서는 차이가 없습니다.
$ grep 'PATTERN' file
매개변수 2에 지정된 파일이 열리고 패턴이 검색됩니다.
$ grep 'PATTERN' <file
file
into(bash의 기능 중 하나)의 내용 을 STDIN
읽고 .STDIN
grep
둘 중 하나에 정확한 이점이 있는지는 확실하지 않지만 후자보다 전자를 계속 사용하겠습니다.
후자는 중복되는 것과 마찬가지로 cat file | grep 'PATTERN'
중복 cat file | sed -e 's|foo|bar|g'
됩니다.
답변3
어떤 경우에는 두 가지가 정확히 동일하지 않습니다. 예를 들면 다음과 같습니다.
$ wc -l ./script.sh
4948 ./script.sh
$ wc -l <./so
4948
먼저 wc
어떤 파일이 처리되고 있는지 파악하고 파일 이름과 줄 번호를 인쇄합니다. 두 번째 명령에서는 wc
어떤 파일이 처리되고 있는지 알 수 없으며 익명으로 입력됩니다.
grep을 사용하는 예제의 특정 명령에서:
$ grep 'PATTERN' file
$ grep 'PATTERN' <file
출력에는 차이가 없습니다. 그러나 이것에는 다음이 있습니다(일치하는 경우).
$ grep -H 'PATTERN' file
$ grep -H 'PATTERN' <file
또한 리디렉션의 경우 <file
쉘이 파일을 읽고 있으며 이는 버퍼의 속도나 크기(다른 명령의 경우)에도 영향을 미칠 수 있습니다.
답변4
차이점은 주로 누가 파일을 여는가에 있습니다. 이건 중요할 수도 있어보안상의 이유-- 쉘은 자신이 시작한 프로그램에 없는 권한을 가질 수 있습니다.
STDIN 방법을 사용한다는 것은 시작된 프로그램에서 생성된 전체 프로세스 트리에 스트림이 상속된다는 의미입니다. 이는 일부 상황에서 유용할 수 있습니다.
와 함께파일을 열다방법을 사용하면 시작된 프로그램이 파일 이름을 더 쉽게 알 수 있습니다. 파일 이름 라우팅을 사용하는 프로그램은 출력에서 파일 이름을 사용할 수 있으며 파일 이름 라우팅은 성능과 같은 다른 측면에서 다를 수 있습니다. 프로그램은 일반적으로 STDIN에 대한 기본 스트림 액세스(조회 없음, 매핑 가능성 없음) 및 파일 이름 매개 변수 찾기 가능성만 가정합니다.