OS_Linux&Unix

[Linux/Unix] stdin, stdout, stderr, and pipes

최선을 다하자! 2022. 12. 27. 15:23

# 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  

원글을 번역하여 작성한 글이므로 오역이 있을 수 있음.