Devlog

File Descriptors와 Redirection 본문

리눅스

File Descriptors와 Redirection

ehdrb92 2023. 2. 25. 00:24

리눅스에서 파일 디스크립터는 열린 파일이나 데이터 스트림을 참조하는 방법으로, 프로세스 내에서 열려 있는 파일 또는 데이터 스트림을 고유하게 식별하는 정수 값이다.

 

여기서 데이터 스트림이란? 간략히 하면 시간이 지남에 따라 사용할 수 있는 일련의 데이터 요소를 의미한다고 한다. 데이터를 생성해 내는 소스에서 생성되어 수신자가 실시간 혹은 거의 실시간으로 소비하는 지속적인 데이터의 흐름이라고 생각하면 된다.

 

그러면 다시 파일 디스크립터의 설명으로 돌아와서 프로세스가 파일 또는 데이터 스트림을 열면 리눅스 커널은 여기에 파일 디스크립터를 할당한다. 그런 다음 이 파일 설명자는 파일 또는 데이터 스트림에서 읽거나 쓰는 데 사용된다. 처음 세 개의 파일 설명자 0, 1, 2는 각각 표준 입력(stdin), 표준 출력(stdout), 표준 오류(stdout)용으로 예약되어 있다.

 

여기서 나오는 표준 입력, 출력, 오류가 여기서 다룰 핵심이다. 이들은 리다이렉션(Redirection) 연산자를 사용하여 특별한 역할을 수행한다. 바로 알아보도록 하자.

표준 입력(stdin)

표준 입력은 입력 데이터를 프로그램에 전달하는 데 사용되는 채널이다. 이 입력은 키보드, 파일 또는 다른 프로그램과 같은 다양한 소스에서 얻어 올 수 있다. 기본적으로 터미널은 표준 입력의 소스이다. 파일에서 프로그램으로 입력을 전달하려면 다음과 같이 활용하면 된다.

> echo "Hello" > hello.txt

"echo"명령어는 본래 뒤에오는 값을 터미널에 그대로 출력하는 기능을 한다. 하지만 위와 같이 리다이렉션 연산자를 사용해서 "hello.txt"라는 파일에 할당하면 출력 값이 나오지 않는다. 대신에 "hello.txt"파일을 생성해 내고 해당 파일의 내부에 "Hello"가 입력되게 된다. 만약 "hello.txt"가 이미 존재했다면, 해당 파일 안의 전체 내용을 "Hello"로 덮어쓰게 된다.

 

그럼 만약 덮어쓰지 않고 그저 내용을 추가해주고 싶다면 다음과 같이 사용할 수 있다.

> echo "Hello" >> hello.txt

연산자를 두 번사용하면 파일 내부의 제일 마지막 줄에 내용이 추가될 것이다.

표준 출력(stdout)

표준 출력은 프로그램의 출력을 표시하는 데 사용되는 채널이다. 기본적으로 터미널은 표준 출력의 대상이다. 왜냐하면 우리가 터미널에서 파일을 출력하면 보통은 터미널상에 출력되기 때문이다. 이를 터미널 대신 다른 파일로 우회시킬 수 있는 것이다. 다음을 보자.

> sort number_list.txt > sorted_number_list.txt

위에서 sort 명령어는 뒤에 "number_list.txt"파일의 출력값을 오름차순으로 정렬하여 터미널 상에 출력한다. 이를 리다이렉션 연산자를 사용하여 다른 파일로 우회시켜 주면, "sorted_number_list.txt"라는 파일에 내용이 입력되게 된다.

 

이 또한 표준 입력과 같이 연산자를 두 개를 쓰면 덮어쓰지 않고, 내용을 추가하게된다.

표준 에러(stderr)

표준 에러는 프로그램에서 생성된 오류 메시지를 표시하는 데 사용되는 채널이다. 이는 오류 메시지가 일반 출력과 혼동되지 않게 하기 위해 표준 입력과 별개로 만들어졌다. 기본적으로 표준 에러의 대상은 터미널이며 역시나 리다이렉션 연산자를 통해 우회시킨다.

> cat list.txt 2> error.txt

cat 명령어를 이용해 list.txt라는 파일의 내용을 확인하려 하는데, 만약 해당 파일이 존재하지 않는 상황이라고 생각해 보자. 그러면 파일이 존재하지 않는다는 에러 메시지를 반환할 것이다. 이를 위와 같이 연산자를 통해 다른 파일에 입력가능하다. 그리고 예상대로 연산자 두 개를 써서 덮어쓰지 않는 것이 가능하다.

'리눅스' 카테고리의 다른 글

리눅스 파일 속성  (0) 2023.02.26
Pipe 연산자  (0) 2023.02.25
history 명령어  (0) 2023.02.23
유용한 터미널 단축키  (0) 2023.02.23