다시 시작하는 리눅스 #16 (복습) 표준입출력, 리다이렉트, tee, xargs

최동민·2023년 2월 12일
0

Linux

목록 보기
25/25

명령어는 입력을 받아서 처리하고 결과를 출력한다.
리눅스를 비롯한 유닉스 계열 OS에는 이런 입출력을 통일된 방식으로 다루는 표준 입력, 표준 출력, 표준 에러 출력 이렇게 세 종류의 입출력이 있다.

많은 리눅스 명령어가 표준 입력으로 입력을 받고 표준 출력으로 결과를 출력하고 표준 에러 출력으로 에러 메시지를 출력한다. 보통은 표준 입력은 키보드, 표준 출력과 표준 에러 출력은 터미널(화면)과 연결된다.

입출력을 파일로 전환하는 기능을 리다이렉트,
다른 명령어 입출력으로 전환하는 기능을 파이프라고 한다.

리다이렉트

명령어는 키보드로 입력을 받아서 화면에 결과를 출력한다.
하지만 명령어에 입력할 양이 많거나 출력한 결과를 파일로 저장하고 싶을 때 표준 입력 또는 표준 출력을 파일로 전환한다.
이때 사용하는 것이 리다이렉트(<,>)이다.

ex) ps > testfile
표준 출력을 파일로 전환하려면 리다이렉트 기호 >를 사용.
출력을 저장할 파일 이름을 > 뒤에 지정.
ps 명령어의 실행 결과는 testfile을 통해 확인할 수 있다.

ex) cat < testfile
표준 입력을 파일로 전환하려면 리다이렉트 기호 <를 사용.
입력할 파일은 <뒤에 지정.

리다이렉트 기호 >를 사용했을 때 지정한 파일이 이미 존재하면 덮어쓰기한다. 덮어쓰기가 아니라 파일 끝에 추가하고 싶으면 리다이렉트 기호 >>를 사용한다.

표준 출력이나 표준 에러 출력은 번호를 지정해서 각각 리다이렉트 할 수 있다.
리다이렉트 기호 앞에 파일 디스크립터 번호를 지정하여 표준 출력 또는 표준 에러 출력을 골라서 파일로 출력 전환이 가능하다.
ex) ls -l wine beer 2> errlog
(wine은 존재하지 않는 파일이다. 이러한 경우 wine에 대한 에러 출력은 errlog에, beer의 ls 표준 출력은 그대로 화면에 출력이 된다. )
리다이렉트 기호 > 앞에 표준 에러 출력의 파일 디스크립터 번호인 2를 지정하면 표준 에러 출력은 지정 파일로 전환하고 표준 출력은 그대로 화면에 출력한다.

디바이스 파일 /dev/null

/dev 디렉터리 아래에는 autofs, disk, sda, null 같은 다양한 파일이 있는데 이런 파일을 디바이스 파일이라고 한다. 하드웨어 디바이스 드라이버나 가상 디바이스를 파일처럼 읽고 쓰기 가능한 가상 파일이다. ls -l로 출력해보면 파일 종류 문자가 b 또는 c이다.
/dev/null 디바이스 파일은 쓰기를 하면 무시하고 파일을 읽으면 파일이 끝났다는 기호 (EOF)를 돌려주는 가상 파일이다. 명령어 출력이나 에러 메시지를 제어하고 싶을 때 표준 출력(표준 에러 출력)을 /dev/null에 리다이렉트 한다.

tee

보통 명령어 출력 결과는 화면에 출력, 리다이렉트 사용시 파일로 출력 전환이 가능.
만약 출력 결과를 화면에도 출력하고 파일로도 저장하고 싶다면 사용한다.
ex) ps | tee testfile
출력 결과를 덮어쓰기가 아닌 파일 마지막에 추가하려면 -a옵션을 사용한다.
ex) date | tee -a testfile

xargs

파일 내용이나 find 명령어 -print 옵션 처리 결과를 인수로 받아서 명령어를 실행하고 싶을 때가 있다. xargs 명령어는 인수로 실행할 명령어명실행할 명령어가 사용할 고정 인수를 지정해서 실행한다.
그러면 표준 입력으로 입력받은 내용을 실행할 명령어에 동적으로 인수로 할당한다. 명령어에 넘기는 인수 개수를 제한하거나 자동으로 분할 실행해서 편리하다.

실행 결과를 인수로 사용하는 방법에는 백쿼테이션 방법과 find 명령어 -exec 옵션을 사용하는 방법이 있다.
하지만 백쿼테이션은 실행 결과(인수 개수)가 너무 많으면 에러가 발생하는 문제가. find 명령어 -exec 옵션은 파일마다 실행해서 한꺼번에 여러 파일명을 지정할 수 없다는 문제가 있다.

다음과 같은 파일이 있다.

cat states | xargs echo

cat states | xargs -n 5 echo

; (연달아 명령어 실행)

여러 명령어를 한꺼번에(한 줄에) 지정해서 순서대로 실행하고 싶다면 ;(세미콜론)을 사용한다. 실행할 명령어를 실행할 순서대로 ;로 나눠서 지정하면 차례대로 실행한다.

ex) date ; pwd

;로 이어진 명령어는 ;의 왼쪽에 있는 명령어의 실행이 끝날 때까지 오른쪽 명령어를 실행하지 않는다. 따라서 sleep 명령어로 실행 시각을 조절할 때 유용하다.
date ; sleep 3m ; date

profile
코드를 두드리면 문이 열린다

0개의 댓글