입출력방향 (재)지정 및 진단 출력
쉘에서 해석되어 어떠한 명령어에 사용되더라도 공통적으로 적용될 수 있도록 만든 것이 메타(meta) 문자이다. 이 메타 문자 중에서 출력방향을 변경하는 것이 리다이렉션 (redirection)입니다.
출력방향 지정(redirection)
# date의 출력을 status 파일에 보관
$ date > status
# 1s 결과를 1inux cmd 파일에 보관
$ Is /bin /us/bin > linux_cmd
# du의 출력을 status 파일에 보관 (과거의 status 파일은 지워짐)
$ du > status
출력방향 재 지정(redirection)
# date의 출력을 status 파일에 추가
$ date >> status
# 1s의 출력을 status 파일에 추가
$ Is -I >> status
입력 방향 지정의 예
$ tr "[a-z]" "[A-Z]" < words > words.upper
$ mail -s "test" freshman < filename
>는 화면에 출려될 내용을 파일로 생성하는 출력방향 지정 문자이다. 또 기존 파일 에 추가하고 싶다면 >>를 사용한다. 따라서, words라는 파일의 소문자를 대문자로 변환 하여 words.upper라는 파일로 보관하도록 한다. >는 입력방향을 지정하는 메타 문자로 명령이에게 전해 파일을 알리는데 유용하다. 즉, freshman이라는 계정에게 제목은 test로 하고 내용은 filename으로 편지를 송부하라는 명령이다.
진단 출력의 예
출력방향 재 지정의 경우에도 명령의 에러 출력은 해당 파일에 보관되지 않는다. 어떤 명령이던지 에러의 결과를 출력하려고 하면 다음과 같이 하여야 합니다.
$ ls /bi /usr/bin 1 > linux_cmd
ls: /bi: 그런 피일이나 디렉토리가 없음
이때 1> 대신하여 >만을 사용하여도 된다. 1은 파일 디스크립터로써 표준 출력을 의미하는 것이다.
$ ls /bi /usr/bin 1 > linux_cmd 2 > err_msg
위의 명령에서 /bi라는 디렉토리가 없다는 메시지는 err_msg파일에 보관되며 /usr/bin의 리스트는 linux_cmd에 보관된다.
$ ls /bi /usr/bin 1 > linux_cmd 2 >& 1
2>&을 사용한다면 출력 결과와 에러 메시지가 함께 linux_cmd에 보관된다. 즉, 표준 출력 1을 표준 에러 2와 같은 파일로 지정한다는 뜻이 됩니다. 2는 표준에러로써 에러출력을 의미하는 파일 스크립터입니다.
$ cp /us/share/doc/glibc-common-2.2.4/examples.threads/*.c ~/work
$ cd ~/work
$ cat ex?.c 2 >& 1 | tr "[az]" "[A-Z]"
ex로 시작하는 C프로그램 파일을 출력하되 파일 스크립터 2를 파일 디스크립터 1의 복사본으로 하고, 파일 디스크립터 1은 파이프를 통하여 tr 명령으로 보냅니다.
기존 파일 보존하기
출력방향 지정(>) 기호를 사용하면 과거에 파일은 없어지고 새롭게 만들어집니다. 이것은 사용자의 실수로 인해서 이루어지는 경우에는 과거의 파일을 없애버리는 결과과 됩니다. 이를 방지하기 위해서 다음과 같이 설정합니다.
$ set -o noclobber
> 다음에 기술된 파일 명으로 이미 다른 파일이 존재한다면, 실행되지 않는다. 즉, 파일이 존재하여 파일에 쓸 수 없다는 메시지가 출력되고 원래 파일은 보존되며, 명령은 실행되지 않습니다. 이는 진단 출력(>&)에도 적용됩니다. 물론, ~/.bashrc에 기록하여 매번 로그인할 때마다 자동적으로 처리될 수 있도록 하는 것이 좋을 것입니다.
$ Is /bin /us/bin > linux_cmd
bash: linux_cmd: cannot overwrite existing file
$ cc -o hell2 hell2.c 2 > hell.c.err
bash: hell.c.err: cannot overwrite existing file
기존 파일 보존 잠정 해지하기
noclobber의 설정 후에 임의의 명령의 실행을 일시 해제하는 명령이 다음과 같습니다.
$ ls /bin >| linux_cmd
$ cc -o hell2 hell2.c 2 >| hell.c.err
linux_cmd라는 파일이 존재해도 방향지정을 허용합니다. 물론 기존의 linux_cmd라는 파일을 제거된다. 또, hel12.c를 컴파일하여 hell2라는 실행 파일을 만들고, 만일 에러가 있으면 hallc.err이라는 파일에 에러를 보관한다. hell.c.er이라는 파일이 존재하면 내용을 없애고 새로운 내용을 보관하게 되는 것입니다.
방향지정 문자 | 내용 |
---|---|
< | 표준 입력방향 지정 |
> | 표준 출력방향 지정 |
1> | 표준 출력방향 지정 |
2> | 진단 출력방향 지정 |
2>&1 | 진단 출력을 표준 출력과 같은 파일로 지정 |
1>&2 | 표준 출력을 진단 출력과 같은 파일로 지정 |
>| | 표준 출력방향 지정 - noclobber 무시 |
>>| | 표준 진단 출력방향 지정- noclobber 무시 |
1>> | 첨가 표준 출력 |
2>> | 첨가 표준 진단 출력 |
1>>| | 첨가 표준 출력 - noclobber 무시 |
2>>| | 첨가 표준 진단 출력 - noclobber 무시 |