Linux 입출력 리다이렉션 소개

소개

Linux에 내장된 리다이렉션 기능은 여러 작업을 최적화하기 위한 견고한 도구 세트를 제공합니다. 소프트웨어 개발의 “유닉스 철학”은 각각이 한 가지 일을 잘하는 도구를 만드는 것이었으며, 이 철학은 현대의 명령 줄 도구로 이어져 개별적으로 강력하며 결합될 때 기하 급수적으로 더 강력해집니다. 복잡한 소프트웨어를 작성하거나 명령 줄에서 작업하는 경우에도 환경의 다른 I/O 스트림을 조작하는 방법을 알면 생산성이 크게 향상됩니다.

필수 조건

이 가이드를 따라가려면 Linux 서버에 액세스할 수 있어야 합니다. 서버에 처음 연결하는 방법에 대한 정보가 필요한 경우 SSH를 사용하여 Linux 서버에 연결하는 방법 가이드를 따를 수 있습니다.

스트림

Linux 환경에서의 입력 및 출력은 세 가지 스트림으로 분산됩니다. 이러한 스트림은:

  • 표준 입력 (stdin)

  • 표준 출력 (stdout)

  • 표준 에러 (stderr)

스트림은 다음과 같이 번호가 매겨집니다:

  • stdin (0)

  • stdout (1)

  • stderr (2)

사용자와 터미널 간의 표준 상호 작용 중에는 표준 입력이 사용자의 키보드에서 제공됩니다. 표준 출력과 표준 에러는 텍스트로 사용자의 터미널에 표시됩니다. 세 개의 스트림을 통틀어서 표준 스트림이라고 합니다.

표준 입력

표준 입력 스트림은 일반적으로 사용자로부터 프로그램으로 데이터를 전달합니다. 표준 입력을 기대하는 프로그램은 일반적으로 키보드와 같은 장치로부터 입력을 받습니다. 이 튜토리얼에서는 한 프로그램의 출력을 다른 프로그램의 표준 입력으로 사용하는 예제를 볼 수 있습니다.

표준 출력

표준 출력은 프로그램에서 생성된 출력입니다. 표준 출력 스트림이 리다이렉트되지 않은 경우, 텍스트가 직접 터미널에 출력됩니다. 임의의 텍스트를 출력해 보세요. echo를 사용합니다:

  1. echo Sent to the terminal
Output
Sent to the terminal

추가 옵션 없이 사용되면, echo 명령은 명령행에 전달된 모든 인수를 출력합니다.

인수 없이 echo를 실행하세요:

  1. echo

빈 줄이 반환됩니다. 인수가 제공되지 않으면 일부 프로그램은 아무 작업도 수행하지 않습니다.

표준 오류

표준 오류는 프로그램에서 발생한 오류를 포함합니다. 표준 출력과 마찬가지로, 이 스트림의 기본 대상은 터미널 디스플레이입니다.

ls 명령을 사용하여 표준 오류의 기본 예제를 살펴보겠습니다. ls는 디렉터리의 내용을 나열합니다.

인수 없이 실행되면 ls는 현재 디렉터리의 내용을 나열합니다. 디렉터리를 인수로 사용하여 ls를 실행하면 해당 디렉터리의 내용을 나열합니다.

  1. ls %

%가 존재하지 않는 디렉터리이기 때문에, 다음 텍스트가 표준 오류로 전송됩니다:

Output
ls: cannot access %: No such file or directory

A program does not have to crash or finish running in order to generate Standard Error, and whether some output is sent to either Standard Output or Standard Error is down to the behavior of the program. They are not technically different from one another in any way — just that one output stream is supposed to be reserved for error messages, and some tools will assume that Standard Error being empty means that a program ran successfully. Some programs will even output minor errors to Standard Error without crashing or failing to also produce the intended output. It is only used as a convention to separate intended output from unintended output.

스트림 리다이렉션

리눅스에는 각 스트림에 대한 리다이렉션 명령이 포함되어 있습니다. 이러한 명령은 표준 출력 또는 표준 오류를 파일에 작성하는 데 사용될 수 있습니다. 존재하지 않는 파일에 작성하기 전에 해당 이름의 새 파일이 생성됩니다.

단일 꺾쇠 괄호가 있는 명령어는 대상의 기존 내용을 덮어씁니다.

덮어쓰기

  • > – 표준 출력

  • < – 표준 입력

  • 2> – 표준 오류

이중 꺾쇠 괄호가 있는 명령어는 대상의 기존 내용을 덮어쓰지 않습니다.

추가

  • >> – 표준 출력

  • << – 표준 입력

  • 2>> – 표준 오류

파이프

파이프는 한 프로그램의 스트림을 다른 프로그램으로 리디렉션하는 데 사용됩니다. 파이프를 통해 첫 번째 프로그램의 표준 출력이 다른 프로그램으로 전송되면, 첫 번째 프로그램의 출력이 터미널에 인쇄되는 대신에 두 번째 프로그램의 입력으로 사용됩니다. 두 번째 프로그램이 반환한 데이터만 표시됩니다.

리눅스의 파이프는 수직 바로 표시됩니다: |

다음은 파이프를 사용하는 명령어의 예입니다:

  1. ls | less

이 명령은 현재 디렉터리의 내용을 표시하는 ls의 출력을 가져와서 less 프로그램에 파이프로 전달합니다. less는 받은 데이터를 한 줄씩 표시합니다.

ls는 일반적으로 여러 행에 걸쳐 디렉터리 내용을 표시합니다. 이것을 less를 통해 실행하면 각 항목이 새로운 줄에 배치됩니다.

파이프의 기능은 >>>의 기능과 유사해 보일 수 있지만, 차이점은 파이프가 데이터를 한 명령어에서 다른 명령어로 리디렉션하는 데 사용되는 반면, >>>는 파일로만 리디렉션됩니다.

필터

필터는 다른 프로그램에서 출력되는 데이터에 자주 사용되는 프로그램의 한 유형입니다. 이들 중 많은 것이 자체적으로도 유용하지만, 특히 파이핑 동작을 잘 설명합니다.

  • find – find에 전달된 인수와 일치하는 파일 이름을 가진 파일을 반환합니다.

  • grep – grep에 전달된 문자열 패턴과 일치하는 텍스트를 반환합니다.

  • tee – 표준 입력을 표준 출력과 하나 이상의 파일로 리디렉션합니다.

  • tr – 하나의 문자열을 다른 문자열로 찾아 바꿉니다.

  • wc – 문자, 줄 및 단어를 세어 반환합니다.

예시

이제 리디렉션, 파이핑 및 기본 필터를 소개했으니, 일반적인 리디렉션 패턴과 예제를 살펴보겠습니다.

명령 > 파일 패턴은 명령의 표준 출력을 파일로 리디렉션합니다.

  1. ls ~ > root_dir_contents.txt

위의 명령은 홈 디렉토리(~)의 내용을 표준 출력으로 전달하고, 출력을 root_dir_contents.txt라는 파일에 작성합니다. 파일이 단일 꺾쇠 명령이므로 파일 내 이전 내용은 삭제됩니다.

명령 > /dev/null 패턴은 표준 출력을 아무 곳으로도 리디렉션합니다. /dev/null은 리디렉션된 데이터를 버리는 데 사용되는 특수한 파일입니다. 필요하지 않은 표준 출력을 버리고 명령이나 스크립트의 기능에 방해가 되는 것을 방지하기 위해 사용됩니다. /dev/null로 보내진 출력은 버려집니다.

  1. ls > /dev/null

이 명령은 ls 명령에서 반환된 표준 출력 스트림을 /dev/null로 전달하여 버립니다.

명령 2> 파일 패턴은 명령의 표준 오류 스트림을 파일로 리디렉션하며, 기존 내용을 덮어씁니다.

  1. mkdir '' 2> mkdir_log.txt

이것은 잘못된 디렉토리 이름 ''으로 발생한 오류를 리디렉션하고, 이를 log.txt에 작성합니다. 오류는 여전히 터미널로 전송되어 텍스트로 표시됩니다.

명령 >> 파일 패턴은 파일의 기존 내용을 덮어쓰지 않고 명령의 표준 출력을 파일로 리디렉션합니다.

  1. echo Written to a new file > data.txt
  2. echo Appended content to an existing file >> data.txt

이 두 명령 쌍은 먼저 사용자가 echo를 통해 입력한 텍스트를 새 파일로 리디렉션합니다. 그런 다음 두 번째 echo 명령이 받은 텍스트를 기존 파일에 추가하여 내용을 덮어쓰지 않습니다.

위의 command 2>> file 패턴은 명령의 표준 오류 스트림을 파일로 리디렉션합니다. 이 때 기존 파일 내용을 덮어쓰지 않습니다. 이 패턴은 프로그램이나 서비스의 오류 로그를 생성하는 데 유용합니다. 로그 파일은 파일이 쓰여질 때마다 이전 내용이 지워지지 않습니다.

  1. find '' 2> stderr_log.txt
  2. wc '' 2>> stderr_log.txt

위의 명령은 잘못된 find 인수로 인한 오류 메시지를 stderr_log.txt라는 파일로 리디렉션합니다. 그런 다음 잘못된 wc 인수로 인한 오류 메시지를 동일한 파일에 추가합니다.

command | command 패턴은 첫 번째 명령의 표준 출력을 두 번째 명령의 표준 입력으로 리디렉션합니다.

  1. find /var lib | grep deb

이 명령은 /var 및 하위 폴더에서 문자열 deb과 일치하는 파일 이름과 확장자를 찾아 파일 경로를 반환하며, 각 경로에서 일치하는 부분은 빨간색으로 강조됩니다.

command | tee file 패턴(포함된 tee 명령)은 명령의 표준 출력을 파일로 리디렉션하고 해당 내용을 덮어씁니다. 그런 다음 리디렉트된 출력을 터미널에 표시합니다. 파일이 이미 존재하지 않으면 새 파일을 생성합니다.

이 패턴의 맥락에서 tee는 일반적으로 프로그램의 출력을 보면서 동시에 파일에 저장하는 데 사용됩니다.

  1. wc /etc/magic | tee magic_count.txt

이 명령은 Linux 셸에서 파일 유형을 결정하는 데 사용되는 /etc/magic 파일의 문자, 줄 및 단어 수를 파이프로 보내 tee 명령에 전달합니다. 그런 다음 tee 명령은 wc의 출력을 두 가지 방향으로 분할하고 터미널 디스플레이 및 magic_count.txt 파일로 보냅니다. tee 명령에 대해 생각해보십시오. T자 모양입니다. 글자의 아래 부분은 초기 데이터이고 윗 부분은 데이터가 두 가지 다른 방향으로 분할되는 것입니다(표준 출력 및 터미널).

여러 개의 파이프를 사용하여 출력을 여러 명령 및/또는 필터로 리디렉션할 수 있습니다.

결론

Linux 명령 줄에 내장된 리디렉션 기능을 사용하는 방법을 배우는 것은 중요한 기술입니다. 리디렉션과 파이프 작동의 기본 사항을 살펴보았으므로 셸 스크립팅의 세계로 진입하여이 가이드에서 강조된 프로그램과 패턴을 빈번하게 사용할 수 있게 될 것입니다.

명령 줄에서 특정 명령 또는 명령 줄에서 수행하려는 작업(예: “대문자로 시작하는 디렉터리의 모든 파일 삭제”)을 찾는 것은 특정 작업을 수행할 때 도움이 될 수도 있습니다.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-i-o-redirection