IT 공부내용 정리/Linux

리눅스 리다이렉션(>) - 결과값을 저장하거나 전달할 때

따뜻한 차가움 2025. 3. 14. 12:11

리다이렉션은 명령의 출력이나 오류메세지를 파일이나 다른 명령으로 전달하는 기능이다.

 

기본 파일 디스크립터

더보기

파일 디스크립터는 운영체제가 파일이나 입출력 스트림을 식별하는데 사용하는 정수이다.

 

0 : 표준 입력

 - 기본적으로 키보드로 받는 입력을 뜻함

 - 명령어에서 입력을 받을 때 사용함

예시) command < input.txt 를 입력한 경우 command에 대한 인수는 input.txt의 내용으로 받음

 

1 : 표준 출력

 - 명령어의 기본출력 스트림

 - 일반적으로 터미널 화면에 출력됨

예시) command > output.txt 를 입력한 경우 command에 대한 결과값을 output.txt로 저장함. 저장위치는 현재 디렉터리

 

2 : 표준 오류

 - 오류 메세지를 출력하는 스트림

 - 표준 출력과 분리된 별도의 스트림으로 오류메세지만 별도로 처리할 수 있다.

예시) command 2> error.txt 를 입력한 경우 command에서 발생한 오류 데이터를 error.txt로 저장함. 저장위치는 현재 디렉터리

 

3 이상 : 사용자 지정 파일 디스크립터

 - 시스템이 지정한 디스크립터는 0,1,2가 끝이기에 미리 지정된 명령어 혹은 사용자가 추가로 입력한 디스크립터에 경우 해당

 - 해당 디스크립터가 지정된 경우 comman 3> custum.txt 처럼 사용할 수 있음.

 

리다이렉션을 이용하려면 특정 데이터를 대입시켜주는 경우가 필요하므로 파일 디스크립션을 알아둘 필요가 있다.

모르는 내용이라면 위 줄임글을 확인해보자

 

리다이렉션의 구조

 - [명령어] < [파일] : [명령어]에 [파일]에 해당하는 값을 입력한다.

 - [명령어] > [파일] : [명령어]의 표준출력을 [파일]로 저장한다. 기존 데이터가 있으면 덮어쓴다.

 - [명령어] >> [파일] : [명령어]의 표준출력을 [파일]로 저장한다. 기존 데이터가 있으면 이어쓴다.

 - [명령어] 2> [파일] : [명령어]의 표준오류를 [파일]로 저장한다. 기존 데이터가 있으면 덮어쓴다.

 - [명령어] 2>> [파일] : [명령어]의 표준오류를 [파일]로 저장한다. 기존 데이터가 있으면 이어쓴다.

 - [명령어] 2>&1 [파일] : [명령어]의 표준오류를 표준 출력과 함께 [파일]로 저장한다. 기존 데이터가 있으면 덮어쓴다.

 - [명령어] &> [파일] : 위 기능과 동일하나 bash 셸 구조의 운영체제가 아닐경우 작동하지 않는다.

 

 - Here Documnet 구조

[명령어] <<EOF

명령내용1

명령내용2

EOF

 

여러줄의 텍스트를 명령어의 표준 입력으로 사용한다.

여기서 EOF는 End Of File의 약자로 동일한 문자열만 사용한다면 어떤 문자를 사용해도 상관 없다.

다만 EOF가 가장 일반적으로 사용한다.

 

 

- Here String 구조

[명령어] <<< "문자열" : 문자열을 명령어의 표준 입력으로 사용한다.

 

 

 

 

예시)

입력 :  ls -la 1>> filelist.txt (1>>는 >>로 사용)

해석 : 명령 "ls -la"의 표준출력(파일 디스크립션 1)을 filelist.txt로 저장(>), filelist.txt가 존재하면 가장 마지막 데이터에 이어서 저장

 

입력 : cat 0< input.txt  (0<는 <로 사용)

해석 : 명령 "cat" 의 표준입력(파일 디스크립션 0)을 input.txt로 사용(<)

 

입력 : ls not_exist_file 2> error.txt

해석 : 명령 "ls not_exist_file"의 표준 오류출력(파일 디스크립션 2)을 error.txt로 저장. error.txt 파일이 존재할 경우 데이터를 덮어서 저장

 

그럼 여기서 의문이 드는 것이 1개 있을 것이다.

표준 출력과 표준 오류 출력을 지속적으로 기록하는 방법이 없을까?

 

당연히 가능하다. 리다이렉션은 동시에 여러 대상을 한꺼번에 작성할 수 있다

예를 들어

[명령어] > [파일1] 2>> [파일2] <[파일3]

라고 입력한 경우

명령어의 표준 입력은 파일3으로 대체, 표준 출력은 파일1에 덮어쓰며, 표준 오류는 파일2에 이어서 작성한다

라고 해석할 수 있다.

 

즉 [명령어] >> [파일1] 2>> [파일2] 라고 작성하면 파일1에는 명령어의 표준출력을 지속해서 작성하고

파일2에는 명령어의 표준 오류출력을 지속해서 작성한다.

 

이때 둘 다 파일1에 기록하고 싶다면

[명령어] >> [파일1] 2>> [파일1] (단, 오류가 먼저 기록될지, 결과값이 먼저 기록될지 알 수 없음)

라고 작성하면 될 것이고 이것을 한번 더 줄여서

[명령어] >> [파일1] 2>&1 (일정한 순서로 기록이 됨)

라고 명령할 수 있다.