Standard Streams 표준 스트림
표준 입력(stdin), 표준 출력(stdout), 표준에러(stderr)는 데이터 스트림으로,
데이터 스트림은 프로그램과 명령어, 프로그램과 명령어가 실행되는 환경을 연결하는 통신 채널입니다.
표준 출력과 표준 에러는 일종의 출력으로, 명령어의 입력에 따라 출력과 에러로 작동합니다.
명령어가 잘 수행되면 내용을 저장하여 파일로 출력하거나 다른 명령어를 수행시키면서,
에러가 있을 때는 로그를 남겨 따로 저장하게 할 수 있습니다.
Standard Output 표준 출력,
데이터의 목적지
명령어를 입력하면 기본적으로 터미널에 결과가 출력됩니다.
여기서 멈추지 않고,
출력된 값을 파일로 저장하거나(.txt)
프린터(또는 다른 장치)로 보내거나
다른 명령어로 전달(입력값으로)할 수 있습니다.
Standard Error 표준 에러, 에러 정보 전달,
명령으로부터 비롯된 결과를 나타내는 데이터 스트림
표준 출력과 크게 다르지 않습니다.
명령어를 입력하면 기본적으로 터미널에 결과가 출력됩니다.
표준 에러를 따로 처리할 수 있습니다.
Standard Input 표준 입력, 명령에 입력되는 데이터 스트림,
연결된 키보드
표준 입력을 통해 전에 있던 파일로부터 명령을 실행하는 것이 가능합니다.
이전 명령(Command 1)의 표준 출력을 표준 입력으로 다른 명령(Command 2)에 전달하여 명령을 실행할 수 있습니다.
Redirection 리다이렉션
표준 입력을 다른 파일이나 다른 명령의 결과로 바꿀 수 있습니다.
표준 출력과 표준 에러에 대한 결과가 터미널 창에 출력되는 것 대신에,
결과를 파일에 저장하여 사용합니다.
redirecting output
> 기호를 이용하여 표준 출력을 리다이렉션할 수 있습니다.
명령어(command)의 결과를 명시한 파일(filename)로 리다이렉션하라고 쉘에 명령합니다.
매개변수에 이미 존재하는 파일을 사용할 수도 있고, 존재하지 않는 파일을 사용할 수 있습니다.
command > filename
(명령어의 결과가 터미널에 출력되는 대신, 특정 파일로 리다이렉션되는 것을 확인할 수 있습니다)
명령어를 수행하고 출력된 결과를 파일로 저장하는 일은 흔합니다.
스크립트를 이용해 원하는 파일(로그파일 등)을 만들 수도 있습니다.
기본적인 형태로 사용하면, 내용을 추가하는 것이 아니라 덮어씌우게 됩니다.
Appending 덮어쓰지 않고 추가하기
>> 을 사용하여 명령어의 결과물을 덮어쓰지 않고 이미 있는 파일에 추가할 수 있습니다.
>> 연산자를 이용하면 파일의 끝에 새로운 데이터를 추가할 수 있습니다.
command >> filename
다양한 명령어와 함께 사용할 수 있습니다.
내용을 수정할 때 상황에 따라,
nano 등의 편집기를 사용하는 것보다 더 효율적일 수 있습니다.
redirecting input
< 기호를 이용하여 표준 입력을 리다이렉션할 수 있습니다.
명시한 파일의(filename)의 내용을 명령어(command)로 리다이렉션하라고 쉘에 명령합니다.
이미 존재하는 파일을 사용해야 합니다.
command < filename
< 기호를 이용해서 파일의 내용을 리다이렉션하고, 명령어를 수행합니다.
(파일을 받아서 표준 입력으로 전달합니다)
combo 표준 입력과 출력을 동시에 리다이렉션 하기
> 을 이용해 출력을 리다이렉션하고, < 을 이용해 입력을 리다이렉션할 수 있습니다.
command < original > output
cat < original.txt > output.txt
위 명령어의 실행 순서를 살펴보면,
1. original.txt가 cat에 표준 입력으로 전달됩니다.
2. cat이 입력을 읽어들인 뒤 출력을 output.txt에 저장합니다.
이는 파일 하나를 읽어서 리다이렉션한 뒤에,
이미 있는 파일에 덮어쓰거나 새로운 파일을 만드는 과정입니다.
sort에 적용할 수도 있습니다.
sort < names.txt > sorted.txt
redirecting standard error 표준 에러의 리다이렉션
표준 에러의 리다이렉션은 조금 다릅니다.
2> 을 사용합니다.
command 2> file
명령을 실행하고, 발생한 오류를 file에 저장합니다.
2>> 을 사용하여, 기존 파일의 하단에 내용을 추가할 수 있습니다.
command 2>> file
모든 표준 스트림은 (세개밖에 없지만) 각각 파일 디스크립터라는 번호가 있습니다.
(표준 입력은 0, 표준 출력은 1, 표준 에러는 2입니다)
원래 표준 출력에 1> 을 사용해야 하지만, 1을 생략할 수 있습니다.
하지만 표준 출력과 표준 에러를 구분함과 동시에, 표준 출력의 리다이렉션이 자주 사용되기 때문에 축약합니다.
따라서 표준 오류는 숫자를 생략하지 않습니다.
(파일 디스크립터 번호를 적지 않으면 표준 출력을 의미하는 1과 같습니다)
all togerther
표준 출력과 표준 에러
dog과 cat 파일을 명령어(cat)로 실행한 결과의 표준 출력을 animal로 리다이렉션합니다.
표준 에러를 error 파일로 리다이렉션합니다.
cat dog cat > animal 2> error
단, 표준 출력과 표준 에러를 동시에 리다이렉션할 때는 표준 출력을 먼저 써야합니다.
(표준 출력 1이 먼저, 표준 에러 2가 그 다음)
2>&1 표준 출력과 표준 에러를 같은 파일에 리다이렉션하기
2>&1 을 사용하여 표준 출력과 표준 에러를 같은 파일에 리다이렉션할 수 있습니다.
1번 파일 디스크립터인 표준 출력을, 주어진 파일 디스크립터 번호로 리다이렉션하라는 명령입니다.
2번(표준 에러)을 1번(표준 출력)으로 리다이렉션하는 구문입니다.
&1은 같은 파일 이름을 두 번 쓰는 대신 표준 출력을 뜻하는 1로 줄여쓰는 것과 같습니다.
ls docs > output.txt 2> output.txt
ls docs > output.txt 2>&1
2>&1은 표준 에러와 표준 출력을 같은 파일에 저장할 때만 사용하는 구문으로 종종 필요할 때가 있습니다.
최근 버전의 bash에서는 아래와 같이 사용할 수도 있습니다.
ls docs &> output.txt
ls docs &>> output.txt
2>&1 보다 &>이 짧고 좋지만,
2>&1 이 오래 전부터 쓰였기 때문에 더 흔히 볼 수 있습니다.
'OS' 카테고리의 다른 글
[Linux Command Line] 확장 (0) | 2024.01.03 |
---|---|
[Linux Command Line] Pipe, 파이프, 파이프라인 (0) | 2024.01.02 |
[Linux Command Line] 파일로 작업하기 (1) | 2023.12.31 |
[Linux Command Line] 리눅스 단축키와 히스토리 (1) | 2023.12.31 |
[Linux Command Line] 삭제, 이동, 복사 (1) | 2023.12.30 |