# stdin, stdout, stderr
- stdin은 입력받은 프로그램을 나타내는 stream이다. (예를 들어, 프로그램이 시작할 때 사용자에게 패스워드를 입력하라고 하는 것)
- stdout은 모든 아웃풋이 존재하는 곳이다. 만약 C로 프로그래밍 했다면, printf를. java로 프로그래밍 했다면, System.out.print로. Python으로 프로그래밍 했다면 print를 떠올려라.
- stderr은 다른 아웃풋 채널이다. 보통 debugging information이나 error를 출력하는 것을 의미한다.
우리가 다음 명령어를 수행했다고 가정하자.
echo foo
이 명령어의 아웃풋은 foo 일 거다. 무슨 일이 일어나는지 다이어그램을 확인해보자.
echo 명령어는 argument인 foo를 인풋했다. (stdin이 아니고)
그리고 stdout에 아웃풋을 덤프했다.
# Redirecting
다음 명령어를 수행했다고 가정해보자.
echo foo > temp.txt
ls
temp.txt 라는 새로운 파일이 생성된다.
내용을 보기 위해서 cat 명령어를 사용하면 된다.
cat temp.txt
그런데
>
> 가 뭐지? 무엇이 생겼는가?
위와 같이 console로 부터 echo 커맨드의 아웃풋을 redirect 했으며 temp.txt 라고 불리는 파일에 집어 넣었다.
존재하는 파일 (내용이 있는) 에 추가하기 위해서는 >> 커맨드를 사용하면 된다.
>>
echo " bar" >> temp.txt
cat temp.txt
# Feeding input
아래 명령어를 수행해보자.
wc -w < temp.txt
아마 2를 얻을 것이다.
wc 는 문자를 카운팅하는데에 사용되는 커맨드 이다.
* 헷갈려서 추가설명
파일 또는 표준 입력의 바이트, 문자, 단어 그리고 줄(라인) 수를 출력해주는 명령어
-w 옵션은 문자의 수를 세어주는 옵션이다.
기본적으로 temp.txt를 wc의 stdin으로 만들면서 temp.txt로 부터의 wc를 가져온다.
foo와 bar가 있을 테니 2 가 출력된다.
# Pipes
어느 하나의 프로그램의 아웃풋을 다른 프로그램으로 인풋 할 수 있을까?
대답은 yes.
우린 | (파이프) 라고 불리는 걸 사용한다.
사용해보자.
echo "foo bar baz" | wc -w
당신의 아웃풋으로 3을 얻었다.
| (pipe) 는 echo 커맨드의 stdout을 stdin 으로써 wc 커맨드로 넘겨준다.
파이프를 사용하면, 많고 작은 심플한 프로그램을 매우 강력한 것으로 실행하기 위한 연쇄작용이 가능하게 만들 수 있다.
# Multiple commands, Variables
파이프와 함께 커맨드를 연쇄함으로써, 아래와 같이. 커맨드의 연속성을 수행할 수 있다.
mkdir foo; touch foo/file.txt
위 케이스에 따르면, foo 디렉토리를 생성하고 file.txt를 foo 디렉토리 안에 생성한다.
;
는 첫 번째 커맨드를 먼저 실행하기 위해 그리고, 두 번째 커맨드를 구별하기 위해 사용한다.
; 으로 커맨드간의 제한되지 않는 사용이 가능하다
마지막으로, 변수로 커맨드의 아웃풋을 save 할 수 있다.
myvar="foo"; echo $myvar | tr '[:lower:]' '[:upper:]'
Let's break this sequence of commands down:
1. 처음에, 문자열 foo의 값을 가지기 위해 myvar이라는 변수를 할당했다.
myvar, =, 변수로 원하는 값 사이에는 절대 space를 사용할 수 없다.
2. 다음으로, myvar 문자의 값을 echo로 출력한다. 변수의 값을 받기 위해, 변수명 앞에 $ 문자와 함께 적는다.
3. 마지막으로, echo로 출력된 값을 tr '[:lower:]' '[:upper:] 로 pipe한다. 그 결과, all lower case 문자들이 upper case로 바뀔 것이다. FOO를 얻겠지.
만약 어떤 명령어의 아웃풋(결과)을 변수로 저장하고 싶다면, 아래와 같이 사용하자.
myvar=$실행시키고 싶은 커맨드
예를 들면
bar=$(echo "Kenny"); echo "Hello $bar"
Hello Kenny가 나오겠지.
bar=$(echo "kenny"); echo "Hello $bar"
Hello kenny
bar=$(echo "love");
echo "Hello $bar"
Hello love
참고자료
https://github.com/kennyyu/bootcamp-unix/wiki/stdin,-stdout,-stderr,-and-pipes
원글을 번역하여 작성한 글이므로 오역이 있을 수 있음.
'OS > Linux&Unix' 카테고리의 다른 글
[Linux] scp로 windows에 파일 전송하기 (0) | 2023.06.19 |
---|---|
[Unix&Linux] NFS가 실행 중인지 확인(Linux 및 UNIX) (0) | 2023.01.06 |
[Linux/Unix] find 조건 -exec ls -al {} \; (0) | 2022.12.23 |
[Linux/Unix] 2>&1 이해하기 (0) | 2022.12.22 |
[Linux/Unix] AIX - machine 전체 CPU 및 Core 수 확인 (0) | 2022.12.22 |