Linux/Unix 예제의 입력 출력 리디렉션

⚡ 스마트 요약

리눅스와 유닉스에서 리디렉션은 명령어가 입력을 읽거나 출력을 보내는 위치를 변경합니다.ping 키보드와 화면에서 '>', '<', '추가' 연산자와 같은 연산자를 사용하여 파일이나 장치를 입력합니다.

  • 🔀 리디렉션: 리디렉션은 명령의 표준 입력 또는 출력을 키보드와 화면에서 파일이나 장치로 변경합니다.
  • 출력: > 연산자는 출력을 파일에 쓰고, >> 연산자는 기존 파일을 지우지 않고 내용을 추가합니다.
  • ⬅️ 입력: `<` 연산자는 키보드 대신 파일을 명령의 표준 입력으로 사용합니다.
  • 🔢 파일 디스크립터: 열려 있는 모든 파일에는 번호가 부여됩니다. 0은 표준 입력, 1은 표준 출력, 2는 표준 오류입니다.
  • ⚠️ 오류 리디렉션: 2>를 사용하면 오류 메시지가 별도의 파일로 전송되어 일반 출력에 포함되지 않습니다.
  • 🔗 결합된 스트림: 2>&1 구문은 표준 오류를 표준 출력과 동일한 대상으로 라우팅합니다.
  • 🤖 AI 도움말: AI 비서와 GitHub Copilot은 리디렉션 명령 및 셸 스크립트를 작성하고 설명할 수 있습니다.

리눅스 및 유닉스에서의 입출력 리디렉션 (예제 포함)

리디렉션은 가장 유용한 기능 중 하나입니다. Linux 유닉스 셸은 명령어가 입력을 읽고 출력을 보낼 위치를 직접 지정할 수 있기 때문에 유용합니다. 이 페이지에서는 출력, 입력 및 오류 리디렉션에 대해 예제와 함께 설명합니다.

리디렉션이란 무엇입니까?

리디렉션은 리눅스에서 명령어를 실행할 때 표준 입력 및 출력 장치를 변경할 수 있는 기능입니다. 기본적인 작업 흐름은 다음과 같습니다. 리눅스 명령어 입력을 받아 출력을 내는 것입니다.

  • 표준 입력(stdin) 장치는 키보드입니다.
  • 표준 출력(stdout) 장치는 화면입니다.

리디렉션을 사용하면 위의 표준 입력 및 출력을 변경할 수 있습니다.

출력 리디렉션

아래 그림은 출력 리디렉션 예제의 시작 부분을 나타냅니다.

출력 리디렉션 섹션 제목 그래픽

'>' 기호는 출력(STDOUT) 리디렉션에 사용됩니다.

예:

ls -al > listings

여기서는 `ls -al` 명령의 출력 결과가 화면이 아닌 "listings" 파일로 리디렉션됩니다. 아래 스크린샷은 그 결과를 보여줍니다.

터미널 화면에 `ls -al` 명령어의 결과가 목록 파일로 리디렉션되어 표시됩니다.

참고: 명령 출력을 파일로 리디렉션할 때 올바른 파일 이름을 사용하십시오. 동일한 이름의 파일이 이미 존재하는 경우, 리디렉션된 명령은 해당 파일의 내용을 삭제한 후 덮어씁니다.

기존 파일을 덮어쓰지 않고 내용을 추가하려면 '>>' 연산자를 사용하세요. 아래 스크린샷은 '>>' 연산자를 사용하여 내용을 추가한 예입니다.

명령어 출력 결과가 기존 파일에 이중 '>' 연산자를 사용하여 추가되는 터미널 화면을 보여줍니다.

표준 출력을 파일뿐만 아니라 장치로도 리디렉션할 수 있습니다.

$ cat music.mp3 > /dev/audio

`cat` 명령어는 음악 파일을 읽습니다.mp3 이 명령은 출력을 오디오 장치인 /dev/audio로 보냅니다. PC의 사운드 설정이 올바르면 이 명령은 음악 파일을 재생합니다.mp3.

입력 리디렉션

아래 그림은 입력 리디렉션을 보여줍니다.

입력 리디렉션 섹션 제목 이미지

'<' 기호는 입력(STDIN) 리디렉션에 사용됩니다.

예: 리눅스의 메일 프로그램을 사용하면 터미널에서 이메일을 보낼 수 있습니다.

키보드, 즉 표준 입력 장치를 사용하여 이메일 내용을 입력할 수 있습니다. 하지만 이메일에 파일을 첨부하려면 다음과 같은 형식의 입력 리디렉션 연산자를 사용할 수 있습니다.

mail -s "Subject" to-address < Filename

아래 스크린샷은 메일 명령어가 파일을 입력으로 읽는 모습을 보여줍니다.

메일 명령어를 사용하여 입력 리디렉션을 통해 이메일에 파일을 첨부하는 방법

이렇게 하면 파일이 이메일에 첨부되어 수신자에게 전송됩니다.

위의 예시는 간단했습니다. 이제 파일 디스크립터를 활용하는 고급 리디렉션 기법을 살펴보겠습니다.

입양 부모로서의 귀하의 적합성을 결정하기 위해 미국 이민국에 Descript오르스(FD)

리눅스와 유닉스에서는 모든 것이 파일입니다. 일반 파일, 디렉터리, 심지어 장치까지도 파일입니다. 모든 파일에는 파일 디스크립터(FD)라고 하는 고유 번호가 부여됩니다.

아래 다이어그램은 표준 스트림과 해당 파일 디스크립터를 보여줍니다.

표준 입력, 출력 및 오류 스트림과 해당 파일 디스크립터의 다이어그램

화면에도 파일 디스크립터가 있습니다. 프로그램이 실행되면 출력 결과가 화면의 파일 디스크립터로 전송되고, 모니터에 프로그램 출력 결과가 표시됩니다. 만약 출력 결과가 프린터의 파일 디스크립터로 전송된다면, 프로그램 출력 결과가 프린터로 인쇄될 것입니다.

오류 리디렉션

터미널에서 프로그램이나 명령어를 실행할 때마다 표준 입력, 표준 출력, 표준 오류라는 세 개의 파일이 항상 열립니다.

이 파일들은 프로그램이 실행될 때마다 항상 존재합니다. 앞서 설명했듯이, 각 파일에는 파일 디스크립터가 연결되어 있습니다.

입양 부모로서의 귀하의 적합성을 결정하기 위해 미국 이민국에 입양 부모로서의 귀하의 적합성을 결정하기 위해 미국 이민국에 Descriptor
표준 입력 STDIN 0
표준 출력 STDOUT 1
표준 오류 STDERR 2

기본적으로 오류 스트림은 화면에 표시됩니다. 오류 리디렉션을 사용하면 오류가 화면이 아닌 다른 파일로 전송됩니다.

오류 리디렉션이 필요한 이유는 무엇입니까?

오류 리디렉션은 유닉스와 리눅스에서 매우 인기 있는 기능 중 하나입니다.

유닉스를 자주 사용하는 사람이라면 많은 명령어가 엄청난 양의 오류를 발생시킨다는 것을 알 것입니다. 예를 들어, 파일을 검색할 때 일반적으로 다음과 같은 오류가 발생합니다. 허가 거부 오류는 일반적으로 특정 파일을 찾는 사람에게 도움이 되지 않습니다. 셸 스크립트를 실행할 때 오류 메시지가 정상적인 프로그램 출력에 방해되는 것을 원하지 않는 경우가 많습니다.

해결책은 오류 메시지를 파일로 리디렉션하는 것입니다.

예제 1

$ myprogram 2>errorsfile

아래 스크린샷은 터미널에서 이 명령어를 실행한 모습입니다.

터미널에서 myprogram을 실행할 때 표준 오류가 errorsfile 파일로 리디렉션됩니다.

위 예시에서는 myprogram이라는 프로그램을 실행하고 있습니다. 표준 오류에 대한 파일 디스크립터는 2입니다. "2>"를 사용하면 오류 출력을 "errorsfile"이라는 파일로 리디렉션할 수 있습니다. 따라서 프로그램 출력에 오류가 과도하게 표시되지 않습니다.

예제 2

다음은 find 문을 사용하는 또 다른 예입니다.

find . -name 'my*' 2>error.log

find 명령어를 사용하여 현재 디렉토리(".")에서 이름이 "my"로 시작하는 파일을 검색하고, 오류가 발생하면 error.log 파일로 보냅니다.

예 3 : 좀 더 복잡한 예를 살펴보겠습니다.

서버 관리자는 종종 디렉터리 목록을 작성하고 오류 및 표준 출력을 파일에 저장하여 나중에 처리합니다. 다음은 해당 명령어입니다.

ls Documents ABC> dirlist 2>&1

아래 다이어그램은 두 스트림이 하나의 파일로 캡처되는 것을 보여줍니다.

표준 출력과 표준 오류가 모두 dirlist 파일로 리디렉션되는 다이어그램

이리:

  • 2>&1은 STDERR이 STDOUT과 동일한 대상(파일 디렉터리 목록)으로 리디렉션됨을 의미합니다.
  • 오류 출력은 표준 출력으로 리디렉션되고, 표준 출력은 다시 dirlist 파일로 리디렉션됩니다. 따라서 두 스트림 모두 dirlist 파일에 기록됩니다.

아래 다이어그램은 입력, 출력 및 오류 리디렉션이 어떻게 서로 연관되는지 요약하여 보여줍니다.

리눅스와 유닉스에서 입력, 출력 및 오류 리디렉션을 요약한 다이어그램

자주 묻는 질문

A 파이프 파이프 연산자(|)는 한 명령의 출력을 다른 명령의 입력으로 직접 보냅니다. 리디렉션은 명령을 파일이나 장치에 연결하여 출력을 해당 파일에 쓰거나 입력을 읽습니다. 파이프는 명령들을 연결하고, 리디렉션은 명령과 파일을 연결합니다.

> 연산자는 명령의 출력을 파일에 쓰고 기존 내용을 덮어씁니다. >> 연산자는 출력을 파일 끝에 추가합니다.ping 이미 있는 내용을 그대로 두세요. 파일을 덮어쓰는 대신 내용을 추가하려면 >> 기호를 사용하세요.

/dev/null은 기록된 모든 내용을 버리는 특수 파일입니다. 명령어에 2>/dev/null을 추가하면 오류 메시지가 해당 파일로 리디렉션되어 조용히 버려지므로 화면에는 일반적인 출력만 표시됩니다. 이는 원치 않는 오류 메시지를 숨기는 일반적인 방법입니다.

`tee` 명령어는 표준 입력에서 데이터를 읽어 화면과 하나 이상의 파일에 동시에 출력합니다. 예를 들어 `ls -al | tee listing.txt`와 같이 사용할 수 있습니다. 이 명령어를 사용하면 명령의 출력을 화면에 표시하면서 동시에 파일로 저장할 수 있습니다.

히어 문서(here document)는 `<<` 연산자를 사용하여 여러 줄의 인라인 텍스트를 명령의 입력으로 전달하고, 사용자가 선택한 마커 단어에서 끝납니다. 이는 셸 스크립트에서 이메일 본문과 같이 여러 줄로 된 입력을 별도의 파일 없이 전달하는 데 유용합니다.

출력을 리디렉션한 후에는 `command > file 2>&1`과 같이 `2>&1` 구문을 사용하여 표준 오류가 표준 출력을 따라 파일로 기록되도록 합니다. 최신 Bash에서는 단축 명령 `&> file`이 동일한 기능을 수행합니다. 순서가 중요하므로 출력 리디렉션 후에 `2>&1`을 배치해야 합니다.

AI 비서는 일반적인 영어 요청을 올바른 리디렉션 명령으로 변환하고, 2>&1 또는 &>와 같은 연산자의 기능을 설명하며, 실행 전에 오류를 표시할 수 있습니다. 또한 머신러닝 도구는 리디렉션된 로그 및 오류 파일을 스캔하여 수동 검토로는 놓칠 수 있는 이상 징후를 찾아냅니다.

예. GitHub 부조종사 목표를 설명하는 간단한 주석을 기반으로 입력, 출력 및 오류를 리디렉션하는 명령과 스크립트를 생성하고, 입력하는 동안 자동으로 완성할 수 있습니다. Rev파일에 대해 제안된 명령어를 검토해 보세요. 특히 기존 데이터를 덮어쓰는 > 명령어를 사용하는 경우 더욱 그렇습니다.

이 게시물을 요약하면 다음과 같습니다.