티스토리 뷰

1. daemon.sh 파일 작성

vi 이용. 아래와 같이 작성한다.

while 문 이후 띄어쓰기는 tab키를 한 번 누른 것이다.

 

2. proclog.sh 파일 작성

마찬가지로 vi 이용하여 아래와 같이 작성한다.

 

3. 터미널에서 실행

./daemon.sh > >(./proclog.sh INFO) 2> >(./proclog.sh ERR) &

위 명령어를 실행했다.

맨 뒤에 &를 주었기 때문에 background에서 running한다.

그런데 실행이 안되는 오류가 발생했다.

이유가 뭔지 몰랐었는데, 다음 실습을 진행하다가 실행권한(rwx) 때문에 그렇다는 것을 알게 되었다.

 

chmod로 권한을 수정해주었다.

 

실행권한을 수정하여 명령어가 실행은 되지만, log_INFO.txt와 log_ERR.txt 는 확인할 수가 없다.

오타가 난 것인지 모르겠다.

 

드디어 문제 해결.

왜 log_INFO.txt와 log_ERR.txt가 없지 하고 ls명령어를 쳐봤는데, 세상에 파일 확장자가 .txt 가 아니고 .log였다.

다시 proclog.sh파일을 확인해보니 저장할 때 .log로 저장했다.

 

그래서 log_INFO.log와 log_ERR.log를 확인하면 결과 화면은 아래와 같다.

 

4. redirection 

 

사실 아직 redirection의 개념을 잘 모르겠어서 정리하고자 한다.

redirection 이란 stdio의 입출력 방향을 바꾸는 것. 명령어 순서에 영향을 받지 않는다.

stdout은 기본적으로 terminal screen과 연결되어 있지만, 특정 파일에 연결시키면 자동으로 파일로 저장되는 효과가 발생한다.

 

명령어 >FILE : 명령어의 stdout(표준출력)을 파일로. 이때 : (null command)를 이용하면 fork-exec없이 즉시 truncate가능하다. 또 null command는 생략도 가능하다.

명령어 <FILE : stdin(표준입력)을 파일에서 입력

명령어 >>FILE : 표준출력을 기존의 파일에 덧붙임. 공백 x. append하는 기능.

명령어 <<<TEXT : 표준 입력에 텍스트를 입력. 텍스트 그 자체가 입력된다. 이때 TEXT에 띄어쓰기는 허용되지 않는다.

 

실습 설명
1. date >date.txt
date명령어의 표준 출력(=현재 시간)을 date.txt에 저장한다.
2. cat <date.txt
cat명령어의 표준 입력을 date.txt에서 가져온다.
3. date >>date.txt
date명령어의 표준 출력(=현재 시간)을 date.txt에 덧붙인다. (append)
4. cat <date.txt
2와 동일.
5. >date.txt
null command를 생략하고 표준출력(null)을 date.txt에 저장.
6. cat <date.txt
2와 동일.
5에서 null을 출력했기 때문에 date.txt에는 아무 내용이 저장되어 있지 않다.
7. cat <<<this is just a text input.
cat명령어의 표준 입력을 텍스트로 주려고 했는데 실패. 띄어쓰기가 허용되지 않는다.
8. cat <<<date.txt
cat명령어의 표준 입력으로 date.txt 전달. 성공.
9.  cat <<<this_is_just_a_text_input.
cat명령어의 표준 입력으로 텍스트 전달 성공.

 

※ fd는 File Descriptor를 의미한다. 프로세스에서 열린 파일의 목록을 관리하는 테이블의 인덱스

&#는 fd를 의미한다.

 

<&# : 표준입력(stdin)을 파일에서 읽어들인다. #에는 숫자를 적는다. 이것은 파일의 fd값을 지정한다. #를 생략하면 0(=STDIN)을 의미한다.

명령어 #>FILE : fd #번 파일로 출력. #를 생략하면 1(=STDOUT)을 의미.

명령어 &>FILE : stdout, stderr를 한꺼번에 묶어서 파일로 저장.

>&# : 출력을 특정 fd #으로 보낼 때 사용. 

a | b : redirection pipe. a, b는 각각 명령어이다. a의 표준 출력은 b의 표준 입력으로 연결된다.

a |& b : stdout, stderr를 결합해서 보낸다. (bash 4.x버전에서 지원하는 기능.) 

실행 화면 설명

 

redirection.sh는 왼쪽과 같이 작성하고 실행권한을 +x하였다.
stdout은 디폴트(=터미널)에 출력하고,
stderr는 &2(=fd2)에 출력한다.
두 개의 출력의 파일 채널은 원래 각각이다.

* 프로그램, 텍스트 파일의 이름이 모두 redirection이므로 아래에서는 생략한다.

1. ./redirection.sh > redirection.txt
프로그램의 실행하면 stdout이 터미널에 출력된다. (무조건)
> : 그리고 프로그램의 표준 출력을 텍스트 파일에 저장한다.

2. ./redirection.sh 2>&1 | cat >redirection.txt
2>&1 : 프로그램의 2(=stderr)를 &1(=stdout)에 저장한다. 이때 복제되면서 덮어지는 것.
따라서 stdout에 stdout과 stderr 두 행이 모두 포함된다.
| : 이것이 cat의 표준입력으로 전달된다.
> : cat의 표준입력을 파일에 쓴다.
위에서 프로그램을 실행했을 때 1,2행이 모두 stdout으로 전달되었기 때문에 터미널에 출력되는 것은 없다.
텍스트파일을 확인하면 두 행이 모두 전달되어진 것을 확인할 수 있다.

3. ./redirection.sh 2>&1 tee >redirection.txt
2>&1 : 프로그램의 2(=stderr)를 &1(=stdout)에 저장한다. 이때 복제되면서 덮어지는 것.
따라서 stdout에 stdout과 stderr 두 행이 모두 포함된다.
| : 이것이 cat의 표준입력으로 전달된다.
> : tee는 표준입력을 출력과 동시에 파일에 저장하는 명령어이다.
위에서 프로그램을 실행했을 때 1,2행이 모두 stdout으로 전달되고, 같은 내용이 터미널에 출력된다.
텍스트파일을 확인하면 두 행이 모두 전달되어진 것을 확인할 수 있다.

 

파이프에서 redirection

파이프는 항상 단방향.

>(cmd) : anonymous pipe를 만들어 cmd명령에 보내어 출력한다.

<(cmd) : cmd명령 결과를 anonymous pipe로 보내어 읽어들인다.

ls -l > >(head -3) ls -l | head -3
왼쪽 명령어 프로세스가 실행 중에도 해당 출력이 오른쪽 명령어로 전달된다. redirection pipe. 왼쪽 명령어 (ls -l)프로세스가 종료된 후에야 해당 출력이 오른쪽 명령어로 전달된다. 원하는 결과가 수집이 안될 수도 있음.

 

redirection : HERE document

ftp에서 많이 사용했던 방식. 요즘에는 많이 안 쓴다.

 

command <<SYMBOL_NAME

이 사이에 쓰는 모든 내용이 표준입력으로 전달된다.

심볼이름은 아무거나 써도 되는데, 보통 HERE을 많이 쓴다.

만약 내용중에 HERE가 들어간다면 전체 내용이 전달되지 않기 때문에 HERE_DOCUMENT라고 쓴다고 한다.

여러 행을 표준 입력으로 전달해야 할 때 사용.

SYMBOL_NAME

 

noclobber

set -o noclobber : redirection에 의한 덮어씌움 금지 명령어.

set +o noclobber : redirection에 의한 덮어씌움 금지 해제 명령어.

>| FILE : 강제로 덮어쓰기

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함