Hyperskill - 컴퓨터 CS 및 영어 독해/Introduction to Git

File descriptors and pipes - 파일 descriptor 와 pipe

코딩크리처 2024. 5. 23. 10:40

hyperskill - File descriptors and pipes 영어 원문

파일과 작업 할 때, 당신은 종종 이러한 파일들에 대한 정보를 작성해야 할 겁니다.

Script는 이 작업을 훨씬 더 쉽게 만들어 줍니다.

파일에 데이터를 작성하는 법을 배우기 전에, file descriptor (파일 설명자) 가 무엇인지 알아야 합니다.

Unix 시스템에서는, input 과 output (IO) 리소스가 각각 descriptor (설명자)를 가지고 있습니다.

descriptor : 설명자 ==> 한글보다는 descriptor로 배우는 것이 더 효율적이라고 판단합니다.

이 descriptor들은 IO 연산자가 어디어 나타날 지 보여 줍니다.

지금, descriptor가 무엇인지, 이것을 어떻게 사용하는지 더 가까이 봅시다.


What is a descriptor - Descriptor은 무엇인가


descriptor는 파일 혹은 다른 IO 리소스에 할당 된 0 이상의 숫자입니다.

이 주제의 나머지를 위해서, 우리는 이 모든 리소스들은 간단히 '파일' 로서 참조합니다.

리소스를 File 로 예시를 들겠다는 얘기인 것 같습니다.

Descriptors 는 순서대로,

파일을 열고, 각 후속 파일들이 다음으로 사용 가능한 descriptor을 가져오도록 할당합니다.

descriptor를 통해서, 우리는 표준 input, 표준 output, 표준 error와 같은 다양한 IO stream에 접속 할 수 있습니다.

Standard Input (stdin) - Descriptor 0

프로그램이 프로세스를 위한 데이터를 수신하는 채널입니다.

간단한 용어로, stdinmailbox 와 비슷한데,

작업하는 데 있어 필요하면서 계속 들어오는 데이터를 수집하는 프로그램이기 때문입니다.

예를 들어, 당신이 터미널에 명령어들을 입력한다면,

시스템에 의해 처리되도록 stdin을 통해 데이터를 보내는 중 입니다.

Standard Output (stdout) - Descriptor 1

이는 프로그램이 받은 데이터를 처리 한 후 완료 된 데이터를 전송 하는 곳 입니다.

Standard Error (stderr) - Descriptor 2

해당 stream은 에러 메세지 혹은 진단을 위해 사용됩니다.


File redirections - 파일 리디렉션


Redirection은 Unix/Linux 시스템에서 유명한 기능입니다.

예를 들어, 터미널을 사용해서 새로운 정보를 파일에 작성 할 수 있습니다.

두 개의 심볼이 있는데, >> 그리고 > 입니다.


  • >> 는 파일에 이미 존재하는 데이터를 지우지 않고 새로운 컨텐츠를 파일에 이어 붙입니다.

    # adding new information to a diary
    echo "Also my facorite things ard ..." >> diary .txt
  • >는 파일에 덮어씌우며, 이미 존재하는 데이터를 지웁니다.

    # rewriting the file content
    echo "My new everlasting love is ..." > secret.txt 

좋습니다, 지금 당신은 파일에 정보를 쓰는 법에 대해서 알았습니다.

하지만, descriptor의 결과를 redirect 해야 한다면 어떡 할 거죠?


Redirections of descriptors - 설명자의 리디렉션


이미 말했듯이, 스크립트를 사용하는 것은 가끔 파일에 정보르ㅜㄹ 작성하는 것을 간소화 할 수 있습니다.

밑의 예제를 살펴 봅시다.


서로 다른 두 메세지들을 서로 다른 두 파일에 동시에 작성해야 한다고 말해 봅시다.

이 임무를 위해 program.sh 스크립트 파일을 만들 수 있습니다.

script는 두 개의 echo 명령어를 담고 있습니다 :

하나는 평범한 메세지이며, 또다른 하나는 에러 메세지입니다.

echo "Just a normal message"
echo "ERROR!" >&2

이 예제에서는, >&2 가 "ERROR!" 메세지를 Standard Error (stderr) 로 지시하는데,

stderrdescriptor 2에 의해 표현됩니다.


이를 실행하기 위해서, 밑의 명령어를 실행 할 수 있습니다.

$ bash program.sh 1> /tmp/log.txt 2> /dev/null

여기에서, 1> /tmp/log.txt 는 평범한 메세지를 log.txt로 리디렉션합니다.

반면에, 2> /dev/null 루트는 에러 메세지를 /dev/null로 리디렉션합니다.

참고로 /dev/null은 여기로 보내진 어떠한 데이터이든 삭제하는 특별한 파일입니다.


standard output을 리디렉션 하는데다, 당신은 에러 메세지 또한 리디렉션 할 수 있습니다.

만약 당신이 한 장소에 모든 에러들을 기록하고 싶다면, program.sh 2> errors.txt를 실행하세요.


참고 할 것 :

program.sh 1> fileprogram.sh > file 둘 다 stdout에 리디렉션하며, 같은 일을 합니다.


이는 기초적으로 어떻게 descriptor을 사용해서 output을 리디렉션하는 지 다룹니다.

하지만, 더 배울 것이 있습니다.

IO streams를 리디렉션하는 방법이 하나 더 있습니다.

이것은 pipeline (파이프라인) 이라 부르며, 연산자 | 에 해당합니다.


Pipe operator


| (pipe::파이프) 의 목적은 하나의 명령어의 결과를 다른 명령어의 input으로서 리디렉션하는 것 입니다.

당신은 command1 | command2 | command3 처럼 여러 개의 명령어들을 묶을 수 있습니다.

이 나열문에서는, 첫 번째 명령어로 인해 표시된 모든 데이터가 두 번째 명령어의 input이 됩니다.

첫 번째 명령어는 스스로의 input(입력문)을 처리하고 나온 산출물을 두 번째 명령어에 전달합니다. 그리고 계속됩니다.

이러한 명령어들은 동시에 실행된다는 것을 참고하는 것이 중요합니다.

이것이 의미하는 바는 첫 번째 명령어에서 나온 산출물이 즉시 두 번째 명령어의 input으로 움직이는데,

첫 번째 명령어가 끝나기를 기다리지 않고 움직입니다.


예를 들어, echogrep을 사용한 간단한 pipline을 봅시다.

echo 명령어는 "Hmm...\nBrr...\nMmm..." 을 출력합니다.

그리고 grep 명령어는 이러한 줄들에서 "m" 이 나타난 모든 경우를 찾습니다 :

$ echo -e "Hmm...\nBrr...\nMmm..." | grep "m"

결과는 아마도 :

Hmm...
Mmm...

grep 명령어에 대해서는 나중에 더 말해 줄 겁니다.

파이프라인을 사용한다면, 당신은 명령어에 있어서 더 복잡한 체인(연결)을 구현 할 수 있습니다.

그러나, 중요한 것은 지금 우리가 어떻게 일반적인지 안다는 것 입니다.

| (pipe) 를 사용해서 더 복잡한 구현이 가능하지만, 중요한 것은 실 사용 예라는 것이다.


Conclusion - 요약


  • DescriptorsIO streams에 접근할 수 있도록 해 줍니다.
  • > 그리고 >> 연산자들은 파일 리디렉션에 사용 될 수 있습니다.
  • > 연산자는 기존의 파일 컨텐츠를 덮어쓰고, >>는 기존의 파일 컨텐츠에 덧붙입니다.
  • Descriptors는 같은 연산자를 사용해서 리디렉션 될 수 있습니다.
  • | (pipe) 는 하나의 명령어의 표준 출력(stdout) 에서,
    또 다른 명령어의 표준 입력 (stdin)에 보낼 수 있게 해 줍니다.


words to remember


subsequent : 후속, 뒤의

directs : 지시하다

discards : 폐기하다, 포기, 버리다

string : 묶다

concurrently : 동시에 == simultaneously

occurrences : 발생, 일어난 일, 사건의 발생 :: 나타난?