리다이렉션
리다이렉션(redirection)은 컴퓨팅에서 표준 스트림을 사용자 지정 위치로 우회할 수 있는 다양한 유닉스 셸을 포함한 대부분의 명령어 인터프리터에 일반적인 명령이다. 방향 지정[1], 방향 변경[2]으로도 부른다.
유닉스 계열 운영 체제에서 프로그램들은 dup2(2) 시스템 호출이나, 이보다 덜 유연하지만 높은 수준의 stdio 유사물들인 freopen(3)과 popen(3)으로 리다이렉션 기능을 수행한다.
표준 입력, 표준 출력의 리다이렉션
[편집]리다이렉션은 특정한 문자열들을 명령어 사이에 두어서 추가되는 것이 보통이다. 일반적으로, 이러한 문자열들의 문법은 다음과 같다:
명령어1 > 파일1
위의 줄은 명령어1
을 실행하며 이로써 나오는 출력물을 파일1
로 내보낸다. 기존에 파일1의 존재하는 경우 기존의 파일 내용은 지우고 새롭게 추가된다.
파일의 끝에 출력물을 추가하려면 >> 연산자를 이용한다:
명령어1 >> 파일1
다음을 이용하면
명령어1 < 파일1
명령어1
을 실행하되, 파일1
이 입력의 대상이 된다. (자판을 이용하는 것과는 반대로)
명령어1 < 들어오는파일 > 나가는파일
위의 줄은 두 개의 기능을 수행한다: 명령어1
은 들어오는파일
에서 내용을 불러들인 뒤 나가는파일
에 기록한다.
파이프 처리
[편집]특정 프로그램이 명시적인 중간 파일이 없더라도, 다른 프로그램의 출력을 읽게 하여 프로그램을 실행할 수 있다.
명령어1 | 명령어2
위의 줄은 명령어1
을 실행하되, 명령어2
에 대한 입력으로서 출력을 사용한다.
아래의 줄은 두 개의 리다이렉션과 임시 파일을 사용하여 동일한 결과를 얻는다:
명령어1 > 임시파일
명령어2 < 임시파일
rm 임시파일
하지만 여기서 명령어2
는 명령어1
을 마칠 때까지 실행하지 않으며, 중간 결과물뿐 아니라 각 작업에 요구되는 작업 공간을 보유하기 위해 충분히 큰 스크래치 파일이 필요하다. 이를테면, 도스는 파이프 문법을 인식하지만 이러한 이차적 접근을 이용한다.
명령어 파이프 처리에 대한 좋은 예로, echo
를 다른 명령어와 결합하여 비상호적인 셸에서 상호적인 일을 수행하는 것이다. 이를테면 다음과 같다.
echo -e "user\npass" | ftp localhost
위 줄에서 \n은 리턴을 의미한다. 이는 입력 user
를 받아 ftp 클라이언트를 실행하고, Enter 키를 누르고 pass
를 입력하는 식이다.
도스 환경에서는 format 명령어로 특정 드라이브를 포맷하려면 사용자의 동의를 위해 키보드 입력 Y를 받아야 한다. 다만 다음의 줄을 이용하면
echo y | format c: /q
사용자의 동의를 구하지 않고(컴퓨터 자판의 Y를 누르지 않고도) 셸이 직접 Y를 누르게끔 하여 C 드라이브를 빠른 포맷으로 포맷할 수 있다.
표준 파일 핸들로 나가거나 들어오는 리다이렉션
[편집]본 셸에서 기원한 유닉스 셸에서 처음 두 가지 동작은 문자열 바로 앞에 숫자(파일 서술자)를 두어 수정할 수 있다. 이것은 어느 스트림이 리다이렉션에 사용되는지에 영향을 준다. 유닉스 표준 입출력 스트림은 다음과 같다:
핸들 | 이름 | 설명 |
---|---|---|
0 | stdin | 표준 입력 |
1 | stdout | 표준 출력 |
2 | stderr | 표준 오류 |
이를테면:
명령어1 2> 파일1
위의 줄은 명령어1
을 실행하되, 표준 오류 스트림을 파일1
로 리다이렉션 처리한다.