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
프로그램이 프로세스를 위한 데이터를 수신하는 채널입니다.
간단한 용어로, stdin은 mailbox 와 비슷한데,
작업하는 데 있어 필요하면서 계속 들어오는 데이터를 수집하는 프로그램이기 때문입니다.
예를 들어, 당신이 터미널에 명령어들을 입력한다면,
시스템에 의해 처리되도록 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) 로 지시하는데,
stderr는 descriptor 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> file
과 program.sh > file
둘 다 stdout에 리디렉션하며, 같은 일을 합니다.
이는 기초적으로 어떻게 descriptor을 사용해서 output을 리디렉션하는 지 다룹니다.
하지만, 더 배울 것이 있습니다.
IO streams를 리디렉션하는 방법이 하나 더 있습니다.
이것은 pipeline (파이프라인) 이라 부르며, 연산자 |
에 해당합니다.
Pipe operator
|
(pipe::파이프) 의 목적은 하나의 명령어의 결과를 다른 명령어의 input으로서 리디렉션하는 것 입니다.
당신은 command1 | command2 | command3
처럼 여러 개의 명령어들을 묶을 수 있습니다.
이 나열문에서는, 첫 번째 명령어로 인해 표시된 모든 데이터가 두 번째 명령어의 input이 됩니다.
첫 번째 명령어는 스스로의 input(입력문)을 처리하고 나온 산출물을 두 번째 명령어에 전달합니다. 그리고 계속됩니다.
이러한 명령어들은 동시에 실행된다는 것을 참고하는 것이 중요합니다.
이것이 의미하는 바는 첫 번째 명령어에서 나온 산출물이 즉시 두 번째 명령어의 input으로 움직이는데,
첫 번째 명령어가 끝나기를 기다리지 않고 움직입니다.
예를 들어, echo
와 grep
을 사용한 간단한 pipline을 봅시다.
echo
명령어는 "Hmm...\nBrr...\nMmm..." 을 출력합니다.
그리고 grep
명령어는 이러한 줄들에서 "m
" 이 나타난 모든 경우를 찾습니다 :
$ echo -e "Hmm...\nBrr...\nMmm..." | grep "m"
결과는 아마도 :
Hmm...
Mmm...
grep
명령어에 대해서는 나중에 더 말해 줄 겁니다.
파이프라인을 사용한다면, 당신은 명령어에 있어서 더 복잡한 체인(연결)을 구현 할 수 있습니다.
그러나, 중요한 것은 지금 우리가 어떻게 일반적인지 안다는 것 입니다.
|
(pipe) 를 사용해서 더 복잡한 구현이 가능하지만, 중요한 것은 실 사용 예라는 것이다.
Conclusion - 요약
- Descriptors는 IO streams에 접근할 수 있도록 해 줍니다.
>
그리고>>
연산자들은 파일 리디렉션에 사용 될 수 있습니다.>
연산자는 기존의 파일 컨텐츠를 덮어쓰고,>>
는 기존의 파일 컨텐츠에 덧붙입니다.- Descriptors는 같은 연산자를 사용해서 리디렉션 될 수 있습니다.
|
(pipe) 는 하나의 명령어의 표준 출력(stdout
) 에서,
또 다른 명령어의 표준 입력 (stdin
)에 보낼 수 있게 해 줍니다.
words to remember
subsequent : 후속, 뒤의
directs : 지시하다
discards : 폐기하다, 포기, 버리다
string : 묶다
concurrently : 동시에 == simultaneously
occurrences : 발생, 일어난 일, 사건의 발생 :: 나타난?
'Hyperskill - 컴퓨터 CS 및 영어 독해 > Introduction to Git' 카테고리의 다른 글
Fork and pull request - Fork와 pull request (PR) (0) | 2024.05.24 |
---|---|
Local repository - 로컬 레포지토리 기초 (0) | 2024.05.24 |
Functions and arguments - 기능과 매개변수 (0) | 2024.05.22 |
First program in bash - Bash 에서 프로그램 만들어보기 (1) | 2024.05.22 |
Starting with GitHub - 깃허브 시작하기 (0) | 2024.05.20 |