소개
리눅스에서 리다이렉션(Redirection)은 명령어의 입력과 출력이 어디로 향할지 제어할 수 있게 해주는 강력한 기능입니다. 이전 실습에서 >나 >>와 같은 연산자를 본 적이 있을 것입니다. 이러한 연산자는 출력을 파일로 리다이렉트하는 데 사용됩니다. 이 실습에서는 리다이렉션의 개념을 소개하고, 리눅스 지식이 없는 초보자도 쉽게 따라 할 수 있도록 다양한 실습 예제를 안내합니다.
리눅스에서 리다이렉션(Redirection)은 명령어의 입력과 출력이 어디로 향할지 제어할 수 있게 해주는 강력한 기능입니다. 이전 실습에서 >나 >>와 같은 연산자를 본 적이 있을 것입니다. 이러한 연산자는 출력을 파일로 리다이렉트하는 데 사용됩니다. 이 실습에서는 리다이렉션의 개념을 소개하고, 리눅스 지식이 없는 초보자도 쉽게 따라 할 수 있도록 다양한 실습 예제를 안내합니다.
출력 리다이렉션의 기초부터 시작해 보겠습니다.
터미널을 엽니다. /home/labex/project 디렉토리에 있어야 합니다. 현재 위치가 확실하지 않다면 pwd (print working directory)를 입력하여 확인할 수 있습니다.
redirect라는 새 파일을 만들고 내용을 입력합니다. 다음 명령어를 입력하세요:
echo 'hello labex' > redirect
이 명령어는 두 가지 작업을 수행합니다:
echo 'hello labex'는 "hello labex"라는 텍스트를 출력합니다.> 기호는 이 출력을 redirect라는 파일로 리다이렉트합니다.파일이 존재하지 않으면 새로 생성됩니다. 이미 존재한다면 기존 내용은 덮어쓰기 됩니다.
이제 같은 파일에 내용을 더 추가해 보겠습니다:
echo 'labex.io' >> redirect
>> 연산자는 >와 비슷하지만, 파일을 덮어쓰는 대신 기존 파일의 끝에 새로운 내용을 추가합니다.
방금 생성하고 수정한 파일의 내용을 확인하려면 cat 명령어를 사용합니다:
cat redirect
첫 번째 줄에는 "hello labex", 두 번째 줄에는 "labex.io"가 표시되어야 합니다.
리다이렉션을 더 깊이 파고들기 전에, 세 가지 중요한 개념을 이해해야 합니다:
리눅스에서 이들은 파일 디스크립터(file descriptor)로 표현되며, 이는 열려 있는 파일을 나타내는 숫자입니다:
| 파일 디스크립터 | 장치 파일 | 설명 |
|---|---|---|
0 |
/dev/stdin |
stdin |
1 |
/dev/stdout |
stdout |
2 |
/dev/stderr |
stderr |
이들을 어떻게 사용하는지 예제를 통해 살펴보겠습니다:
먼저 Documents라는 새 디렉토리를 만듭니다:
mkdir Documents
이 명령어는 새 디렉토리를 생성합니다. 디렉토리가 이미 존재한다는 에러가 발생해도 괜찮습니다. 기존 디렉토리를 사용하면 됩니다.
이제 이 디렉토리에 C 파일을 생성합니다:
cat > Documents/test.c << EOF
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
EOF
이 명령어는 몇 가지 작업을 수행합니다:
cat >는 파일 쓰기 프로세스를 시작합니다.Documents/test.c는 작성할 파일입니다.<< EOF는 "EOF"(End Of File)가 나타날 때까지 입력을 계속 받으라고 셸에 지시합니다.EOF는 입력의 끝을 나타냅니다.이제 이 파일의 내용을 확인합니다:
cat Documents/test.c
방금 생성한 C 코드가 보여야 합니다.
이제 표준 에러를 리다이렉트하는 방법을 살펴보겠습니다:
존재하는 파일 하나와 존재하지 않는 파일 하나를 읽어보겠습니다:
cat Documents/test.c nonexistent.c
test.c(존재함)의 내용과 nonexistent.c(존재하지 않음)에 대한 에러 메시지가 표시됩니다. test.c의 내용은 stdout으로 전송되고, 에러 메시지는 stderr로 전송됩니다.
이제 표준 출력은 파일로, 표준 에러는 다른 파일로 리다이렉트해 보겠습니다:
cat Documents/test.c nonexistent.c > output.log 2> error.log
이 명령어는 여러 작업을 수행합니다:
cat Documents/test.c nonexistent.c는 두 파일의 내용을 표시하려고 시도합니다.> output.log는 stdout(파일 디스크립터 1)을 output.log라는 파일로 리다이렉트합니다.2> error.log는 stderr(파일 디스크립터 2)를 error.log라는 파일로 리다이렉트합니다.두 파일의 내용을 확인합니다:
echo "Output log:"
cat output.log
echo "Error log:"
cat error.log
output.log에는 test.c의 내용이, error.log에는 nonexistent.c에 대한 에러 메시지가 있어야 합니다.
때로는 표준 출력과 표준 에러를 모두 같은 파일로 리다이렉트하고 싶을 때가 있습니다. 이는 일반 출력이나 에러 메시지 여부와 상관없이 명령어의 모든 출력을 캡처하려는 경우 특히 유용합니다.
현재 디렉토리의 내용과 존재하지 않는 디렉토리의 내용을 한 번에 나열해 보겠습니다:
ls -l . nonexistent_directory > combined_output.log 2>&1
이 명령어는 여러 작업을 수행합니다:
ls -l .은 현재 디렉토리의 내용을 나열합니다.nonexistent_directory는 존재하지 않는 디렉토리를 나열하려는 시도입니다.> combined_output.log는 stdout을 combined_output.log라는 파일로 리다이렉트합니다.2>&1은 stderr를 stdout과 같은 곳(이 경우 combined_output.log)으로 리다이렉트합니다.결합된 출력 파일의 내용을 확인합니다:
cat combined_output.log
이 파일 안에 디렉토리 목록과 존재하지 않는 디렉토리에 대한 에러 메시지가 모두 포함되어 있어야 합니다.
bash에서 stdout과 stderr를 모두 같은 파일로 리다이렉트하는 단축 방법이 있습니다:
ls -l . nonexistent_directory &> another_combined_output.log
&> 연산자는 > file 2>&1과 동일합니다.
이 새 파일의 내용을 확인합니다:
cat another_combined_output.log
이전 파일과 동일한 출력이 보여야 합니다.
"비트 버킷(bit bucket)" 또는 "블랙홀"이라고도 불리는 /dev/null 장치는 기록된 모든 데이터를 폐기하는 특수 파일입니다. 셸 스크립팅과 명령줄 작업에서 여러 유용한 용도로 사용됩니다.
명령어 출력 억제:
이미 표준 출력을 억제하는 방법을 살펴보았습니다:
ls -l > /dev/null
표준 출력과 표준 에러를 모두 억제하는 방법은 다음과 같습니다:
ls -l nonexistent_directory > /dev/null 2>&1
에러 메시지만 억제하기:
출력은 보고 싶지만 에러 메시지는 보고 싶지 않을 때가 있습니다:
ls -l . nonexistent_directory 2> /dev/null
디렉토리 목록은 보이지만, 존재하지 않는 디렉토리에 대한 에러는 표시되지 않습니다.
/dev/null을 빈 파일로 사용하기:
/dev/null은 빈 파일 입력으로 사용할 수 있습니다. 이는 입력 파일이 필요하지만 실제 입력을 제공하고 싶지 않은 명령어에 유용합니다. 예를 들어:
grep "pattern" /dev/null
/dev/null은 빈 파일이므로 이 명령어는 아무런 출력을 생성하지 않습니다.
파일 존재 여부 테스트:
출력을 생성하지 않고 파일이 존재하는지 테스트하기 위해 /dev/null을 사용할 수 있습니다:
if cp Documents/test.c /dev/null 2> /dev/null; then
echo "File exists and is readable"
else
echo "File does not exist or is not readable"
fi
이 스크립트는 test.c를 /dev/null로 복사하려고 시도합니다. 성공하면 파일이 존재하고 읽을 수 있다는 의미입니다.
파일 내용 비우기:
/dev/null을 사용하여 파일 내용을 빠르게 비울 수 있습니다:
cat /dev/null > combined_output.log
파일이 비어 있는지 확인합니다:
cat combined_output.log
출력이 없어야 하며, 이는 파일이 비어 있음을 의미합니다.
이번 실습에서는 리눅스의 데이터 스트림 리다이렉션에 대해 배웠습니다. 다음 내용을 실습했습니다:
>와 >>를 사용한 기본 출력 리다이렉션.2>를 사용한 표준 에러 리다이렉션./dev/null로 리다이렉트하여 출력 폐기하기.이러한 리다이렉션 기술은 명령어의 출력이 어디로 향할지 제어할 수 있게 해주는 리눅스의 강력한 도구입니다. 스크립팅, 로깅, 그리고 명령어 출력을 효과적으로 관리하는 데 필수적입니다. 리눅스를 계속 사용하다 보면 이러한 기술이 유용하게 쓰이는 많은 상황을 마주하게 될 것입니다.