리눅스 Redirection

su-mmer·2022년 1월 17일
0

리눅스

목록 보기
1/9
post-thumbnail

stdio(Standard Input Output)

  • 표준입력(stdin, 0): 프로세스에 입력이 들어오는 것
    • cat
  • 표준 출력(stdout, 1): 프로세스가 반환하는 것
    • ls -l
  • 표준 에러(stderr, 2): 프로세스가 실행됐을 때 오류
    • No Such file or directory . . .

리다이렉션(redirection)

  • 표준 입출력의 대상을 변경
  • 일반적으로 출력 값을 파일로 저장하는 용도로 사용
  • 표준 입출력 및 표준 에러에 대한 처리 가능
  • ex. # ls -l > list.txt -> ls -l 명령을 list.txt 파일에 저장
연산자기능
<표준 입력 재지정
>표준 출력 재지정(덮어쓰기)
>>표준 출력 재지정(이어쓰기)
2>표준 에러 재지정(덮어쓰기)
2>>표준 에러 재지정(이어쓰기)
&>표준 출력 & 에러 재지정(덮어쓰기)
&>>표준 출력 & 에러 재지정(이어쓰기)

※ 표준 입력은 앞에 0이, 출력은 1이 생략된 것이다. 0<, 1>, 1>>

실습

표준 출력 재지정

[user@localhost 220117]$ ls -l /usr/bin > ls-output.txt
[user@localhost 220117]$ ls -l ls-output.txt 
-rw-rw-r--. 1 user user 100951 Jan 18 00:02 ls-output.txt

/usr/bin의 목록을 ls-output.txt 파일에 저장한다.

[user@localhost 220117]$ ls -l /bin/usr > ls-output.txt 
ls: cannot access /bin/usr: No such file or directory
[user@localhost 220117]$ ls -l ls-output.txt 
-rw-rw-r--. 1 user user 0 Jan 18 00:02 ls-output.txt

존재하지 않는 /bin/usr 디렉토리를 입력했기 때문에 오류 메세지가 출력된다.

ls는 오류 메세지를 표준 출력으로 전송하지 않고 표준 오류로 전송한다. 표준 출력만을 재지정해서 오류 메세지가 출력된 것이다.

파일은 만들어졌지만 안에 아무 내용도 안 들어갔기 때문에 ls-output.txt 파일은 size가 0인 파일로 생성된다.
=> 빈 파일이 필요할 때 > ls-output.txt의 방식을 사용하기도 한다.

[user@localhost 220117]$ ls -l /usr/bin >> ls-output.txt 
[user@localhost 220117]$ ls -l /usr/bin >> ls-output.txt 
[user@localhost 220117]$ ls -l /usr/bin >> ls-output.txt 
[user@localhost 220117]$ ls -l ls-output.txt 
-rw-rw-r--. 1 user user 302853 Jan 18 00:09 ls-output.txt

>> 연산자를 사용하여 파일에 내용을 이어붙일 수 있다. 3번 이어붙이고 size가 3배가 된 것을 볼 수 있다.

표준 에러 재지정

[user@localhost 220117]$ ls -l /bin/usr 2> ls-error.txt
[user@localhost 220117]$ cat ls-error.txt 
ls: cannot access /bin/usr: No such file or directory

파일 디스크립터 2를 사용하여 표준 오류를 재지정한다.

[user@localhost 220117]$ ls -l /etc/hosts /etc/monday 2> error.txt
-rw-r--r--. 1 root root 158 Jun  7  2013 /etc/hosts
[user@localhost 220117]$ ls -l /etc/monday
ls: cannot access /etc/monday: No such file or directory

정상 디렉토리인 /etc/hosts는 ls 명령어로 출력이 된다.
없는 디렉토리인 /etc/monday에 대한 ls 명령어의 표준 오류는 error.txt에 저장된다.

# 표준 출력과 에러를 각각 다른 파일에 저장
[root@localhost 220114]# ls -l /etc/hosts /etc/monday > redirection2.txt 2> error2.txt
[root@localhost 220114]# cat redirection2.txt 
-rw-r--r--. 1 root root 158 Jun  7  2013 /etc/hosts
[root@localhost 220114]# cat error2.txt 
ls: cannot access /etc/monday: No such file or directory

표준 출력과 표준 오류를 한 파일로 재지정

# 두 번의 리다이렉션
[user@localhost 220117]$ ls -l /bin/usr > ls-output.txt 2>&1

'>'을 사용하여 표준 출력으로 ls-output.txt에 저장한다.
'2>'은 에러 출력이다.
에러 출력을 '&1'을 이용해 표준출력의 출력장치로 지정된 파일을 표준에러 출력장치로 함께 사용한다는 의미다.

리다이렉션의 순서는 매우 중요하다. 표준 오류의 재지정은 항상 표준 출력을 재지정한 뒤에 이루어져야 한다. 표준 오류를 먼저 출력하게 되면 출력장치가 지정되지 않은 상태이기 때문에 표준 오류가 콘솔에 출력된다.

# 간소화된 리다이렉션
[root@localhost 220114]# ls -l /etc/hosts /etc/monday &> plusredi.txt 
[root@localhost 220114]# cat plusredi.txt 
ls: cannot access /etc/monday: No such file or directory
-rw-r--r--. 1 root root 158 Jun  7  2013 /etc/hosts

단일 표기법 &> 사용

원치 않는 출력 제거

[user@localhost 220117]$ ls -l /bin/usr 2> /dev/null

/dev/null 파일은 비트 버킷(bit bucket)이라고 불리는 시스템 장치로, 입력을 받고 아무것도 수행하지 않는다. 즉, 표준 에러를 버린 것이다.

표준 입력 재지정

cat 명령어는 페이지 구분 없이 파일을 표시한다. 여러 파일을 명령 인자로 허용하여 파일을 하나로 합칠 수 있다.

[user@localhost 220117]$ cat movie.mpeg.0* > movie.mpeg

위와 같이 표기하여 movie.mpeg.001 movie.mpeg.002 ... movie.mpeg.099의 작업을 줄일 수 있다.

cat을 파일명 없이 사용하면 입력을 그대로 콘솔에 출력해준다.

표준 입력을 표준 출력으로 복사한 것이다.

[user@localhost 220117]$ cat
I love pumpkin tea.           
I love pumpkin tea.

ctrl+D 키로 입력 명령을 끝낼 수 있다.(EOF)

[user@localhost 220117]$ cat > pumpkin.txt
I love pumpkin tea. Do you?
[user@localhost 220117]$ cat pumpkin.txt 
I love pumpkin tea. Do you?

cat 명령어에 > 연산자를 이용하여 표준 출력을 pumpkin.txt 파일로 재지정하였다.

[user@localhost 220117]$ cat < pumpkin.txt 
I love pumpkin tea. Do you?

<연산자를 이용하여 표준 입력을 pumpkin.txt 파일로 변경했다.

참고

[리눅스 커맨드라인 완벽 입문서] - 윌리엄 E.샤츠 주니어

0개의 댓글