2015. 7. 29. 11:30

* 파이프와 재지정


$ ls -l > lsoutput.txt


: ls 명령의 출력을 lsoutput.txt라는 파일에 저장


표준 파일 서술자

0 : 프로그램의 표준 입력

1 : 프로그램의 표준 출력

2: 프로그램의 표준 오류 출력


만일 해당 파일이 이미 존재하면 새 내용이 기존 내용을 덮어 쓰게 된다


파일 끝에 새로운 내용을 덧붙이고 싶다면 >> 연산자를 사용한다


예를 들어, 


$ ps >> lsoutput.txt


ps 명령의 출력을 해당 파일의 끝에 추가한다


표준 출력 이외의 출력을 재지정할 때는 > 연산자 앞에 해당 출력의 파일 서술자를 붙인다. 예를 들어 표준 오류 출력을 재지정하려 할 때에는 표준 오류 출력의 파일 서술자가 2이므로 2> 연산자를 사용하면 된다. 표준 오류의 재지정은 프로그램이 출력하는 오류 정보가 화면에 나타나지 않게 하고 싶을 때 유용하다


* 입력 재지정


$ more < killout.txt


killout.txt의 내용을 more에 입력한다


* 파이프

파이프 연산자( | )를 이용하면 프로세스들을 서로 연결할 수 있다. 리눅스에서는 파이프들로 연결된 프로세스들이 동시에 실행될 수 있으며, 자료가 흐름에 따라 자동으로 실행 일정이 조정된다. 간단한 예로, ps의 출력을 sort 명령으로 정렬해보자


만일 파이프를 사용하지 않으면 다음과 같이 두 단계를 거쳐야 한다


$ ps > psout.txt

$ sort psout.txt > pssort.out


그러나 파이프를 이용해서 프로세스들을 연결한다면 다음처럼 할 수 있다


$ ps | sort > pssort.out


그런데 출력 내용이 한 화면을 넘기면 보기 힘들어질 때  more를 추가하자


$ ps | sort | more


현실적으로 파이프로 연결할 수 있는 프로세스 개수는 한계가 없다


셀을 제외한 서로 다른 모든 프로세스들의 이름을 알파벳순으로 보고 싶다고 하자


$ ps -xo comm | sort | uniq | grep -v sh | more


이것은 ps의 출력을 알파벳순으로 정렬하고, 

uinq를 이용해서 중복된 항목들을 제외하고,

grep -v sh를 이용해서 sh라는 이름의 프로세스를 제외하고,

마지막으로 이상의 결과를 페이지 별로 화면에 출력한다


이처럼, 각 명령의 결과를 개별 임시 파일에 저장하는 방식보다는 이처럼 명령들을 파이프로 연결하는 방식이 우아한 해법이다.


일련의 명령들을 수행할 때 같은 파일 이름을 두 번 사용해서는 절대 안된다


$ cat mydata.txt | sort | uniq > mydata.txt


를 수행하면 그냥 빈 파일이 만들어진다. mydata.txt 파일이 cat으로 읽히기 전에 덮여 쓰이기 때문이다.