쉘 스크립트에 출력 리다이렉션을 작성할 때,
출력 리다이렉션을 특정 파일 디스크립터에 하고 싶다면
>&<파일 디스크립터 번호>
의 형식으로 입력합니다.
(&<파일 디스크립터>
는 해당 파일 디스크립터
가 출력되는 장소를 나타냅니다)
echo "this is error message" >&2
이때 기호 뒤에 파일명
을 적어주지 않습니다.
이렇게 작성하면 나중에 스크립트 파일을 실행할 때,
특정 파일로 해당 파일 디스크립터로
출력 리다이렉션을 수행할 경우,
한 번에 동작합니다.
예를 들어, 두 개의 에러 메시지에 대해 >&2
로 지정해주었습니다.
$ cat test1
#!/bin/bash
echo "this is error message" >&2
echo "this is normal message"
echo "this is error message 2" >&2
$ ./test1
this is error message
this is normal message
this is error message 2
단순히 파일을 실행하면 모든 메시지가 모니터에 나타납니다.
하지만, 파일을 실행하면서 특정 파일 디스크립터
로 출력 리다이렉션을 할 경우,
스크립트 파일에서 출력으로 지정된 파일 디스크립터
중 해당하는 메시지가 리다이렉션 됩니다.
$ ./test1 > test
this is error message
this is error message 2
$ cat test
this is normal message
$ ./test1 2> test2
this is normal message
$ cat test2
this is error message
this is error message 2
각 줄 마다 >&2
와 같은 형식을 적기가 귀찮다면 exec
를 활용하는 방법이 있습니다.
$ cat test1
#!/bin/bash
exec 1> test
echo "this is error message"
echo "this is normal message"
echo "this is error message 2" >&2
$ ./test1
this is error message 2
$ cat test
this is error message
this is normal message
여기서 눈 여겨 볼 점은 exec
로 1번 파일 디스크립터
로 출력 리다이렉션을 설정했지만, >&2
가 붙은 줄의 경우 리다이렉션 되지 않았습니다.
커맨드라인에서 2번 파일 디스크립터
로 출력 리다이렉션 할 경우 해당 항목이 리다이렉션 되는 것을 확인할 수 있습니다.
$ ./test1 2> test2
$ cat test2
this is error message 2