질문
바보 같은 질문일 수도 있지만, 정말로 Redirection과 Pipe의 차이를 모르겠습니다. Redirection 은 ls > log.txt
와 같이 stdout/stdin/stderr의 방향을 돌리는데(redirect) 사용합니다. ls | grep file.txt
와 같이 Pipes는 다른 명령의 입력으로 명령의 출력을 제공할 때 사용합니다. 하지만 왜 동일한 작업을 위해서 서로 다른 두 명령어를 사용합니까?
왜 그냥 간단히 ls > grep
을 사용하지 않습니까? 이것도 redirection의 한 종류가 아닙니까?
답변
Pipe는 출력을 다른 프로그램 이나 유틸리티 로 넘길 때 사용합니다.
Redirection은 출력을 파일 이나 스트림으로 넘길 때 사용합니다.
예 : thing1 > thing2
vs thing1 | thing2
thing1 > thing2
- 쉘이 프로그램(
thing1
)을 실행합니다. - 프로그램(
thing1
)의 모든 출력은 파일(thing2
)에 쓰입니다. (참고 - 만약 이미thing2
가 존재한다면, 덮어쓸 것입니다.)
만약 프로그램(thing1
)의 출력을 다른 프로그램(thing2
)으로 건네주고 싶다면 아래와 같이 할 수 있습니다.
thing1 > temp_file && thing2 < temp_file
이것은
- 쉘이 프로그램(
thing1
)을 실행합니다. - 프로그램(
thing1
)의 모든 출력은 파일(temp_file
)에 쓰입니다. - 그리고 쉘이 프로그램(
thing2
)을 실행합니다. 이때 사람이 프로그램의 입력에 마치 키보드로 파일(temp_file
)의 내용을 타자 친 것처럼 쉘이 동작합니다.
이 방법은 투박하기 때문에, 이를 좀 더 간단히 할 수 있도록 했습니다. thing1 | thing2
가 thing1 > temp_file && thing2 < temp_file
와 동일한 역할을 하는 것입니다.
질문에 추가로 남겨진 코멘트에 대해 더욱 상세한 답변을 달자면 :
만약 >
를 프로그램으로 건네는데도 사용하고 파일에 입력으로도 사용한다면 두 경우 모두 문제를 야기할 것입니다.
첫 번째 예시: 여러분이 파일에 쓰기를 시도하고 있습니다. 이미 파일이 존재하고 여러분은 덮어쓰기를 원합니다. 하지만 만약 파일이 실행 가능한 상태라면, 아마도 쉘은 이 파일의 입력으로 해당 내용을 건네면서 이 파일을 실행하려고 할 것입니다. 때문에 새로운 파일에 출력을 쓰고 그 파일 이름을 변경해주는 것 같은 작업을 해야 할 것입니다.
두 번째 예시: Florian Diesch 가 지적했듯이 만약 실행 경로에 여러분이 만들고자 하는 파일과 동일한 이름을 가진 프로그램이 존재한다면 여러분은 꼼짝없이 갇히게 됩니다.
세 번째 예시: 만약 여러분이 명령 이름에 오타를 냈다면, 명령어가 없다는 경고를 할 수 없습니다. 현재는 여러분이 ls | gerp log.txt
라는 오타를 냈다면 bash: gerp: command not found
라는 경고가 표시됩니다. 하지만 >
을 두 가지 의미로 모두 사용한다면 쉘은 gerp
라는 새로운 파일을 생성할 것입니다. 그리고 log.txt
에 무엇을 할지 모른다는 경고를 할 것입니다.
추가 (Redirection 예시)
프로그램의 결과(stdout)를 파일로 저장하기
- command의 출력(
stdout
)을 filename에 기록하며 파일이 없다면 생성합니다. - 존재하는 파일에 덮어쓰지 않고 이어쓰기를 하려면
>>
를 사용합니다.
$ command > filename
$ command >> filename
프로그램의 입력을 파일로 지정하기
- filename의 내용을 command의 입력(
stdin
)으로 입력
$ command < filename
stderr를 파일로 출력하기
stderr
를 filename에 출력하기- 숫자 2는
stderr
의 file descriptor 의미합니다. stdin=0
stdout=1
stderr=2
$ command 2> filename
stderr를 stdout으로 출력하기
- stdout을 의미하는 1은 일반적인 파일명과 구분하기 위해서
&
를 사용합니다.
$ command 2>&1
출처
'기타' 카테고리의 다른 글
외부 JavaScript 불러오기 (async, defer) (0) | 2020.07.08 |
---|---|
JavaScript로 PWA 만들기 - 캐시 업데이트 반영하기 (0) | 2020.06.17 |
유튜브 영상 오디오 추출하기 (0) | 2020.05.07 |
PythonCode_입력장치 제어 (0) | 2020.02.23 |
Youtube Data APIv3 할당량 0 오류 (0) | 2019.12.04 |