리디렉션은 프로그램의 입력과 출력의 방향을 바꾸는 메커니즘.
프로세스의 표준 입출력을 변경해 파일로부터 데이터를 읽거나 데이터를 파일에 쓰는 방법을 제공한다.
리디렉션은 크게 출력 리디렉션과 입력 리디렉션으로 나눌 수 있음
리눅스 시스템에서 스트림은 데이터가 흐르는 가상의 통로이다(표준 입력 스트림, 표준 출력 스트림, 표준 에러 스트림). 리디렉션은 이러한 스트림의 방향을 변경하는 것.
예를 들어, ls -l > file_list.txt
명령을 실행하면 ls 명령의 표준 출력 스트림이 터미널 화면 대신 file_list.txt 파일로 향하게 된다.
출력 리디렉션의 기본 형식:
명령 [스트림_번호] > 파일
명령 [스트림_번호] >> 파일
>
를 부등호보다는 화살표로 생각하면 이해하기 쉽다. 실행한 명령의 출력 스트림을 파일로 보낸다는 의미이다.
>
는 저장할 내용을 파일에 덮어쓴다. 그래서 기존 파일에 리디렉션하면 파일 내용이 삭제되고 새롭게 저장한 내용만 남는다. 파일이 존재하지 않는 경우에는 파일을 생성하면서 내용을 저장한다.
>>
는 파일의 끝부분에 내용을 추가한다. 이 역시 존재하지 않는 파일에 리디렉션 하면 파일을 새롭게 저장한다.
>
나 >>
앞에 스트림 번호는 입력할 수도 있고, 생략할 수도 있다. 스트림 번호를 생략하면 표준 출력(스트림 번호1)이 기본 값으로 설정된다.
표준 에러는 스트림 번호 2로 표기한다.
실제 예시
$ echo "Hello World" > output.txt
$ cat output.txt
Hello World
이 과정에서 일어나는 일:
>
리디렉션으로 인해 화면 대신 output.txt 파일로 출력이 전달됨$ ls nonexistent_file 2> error.txt
$ cat error.txt
ls: cannot access 'nonexistent_file': No such file or directory
이 과정에서 일어나는 일:
2>
리디렉션으로 인해 error.txt 파일로 전달됨입력 리디렉션(<
)은 키보드로부터 받는 입력을 파일로부터 받도록 변경하는 것.
기본 형식 : 명령어 [스트림_번호] < 파일
파이프라인(pipeline)은 리디렉션에서 한 걸음 더 나아간 기능. 리디렉션이 프로세스 스트림과 파일 간 상호작용이라면 파이프라인은 프로세스 스트림 간 상호작용이다.
파이프라인(|
)은 한 명령어의 출력을 다른 명령어의 입력으로 직접 연결하는 메커니즘이다.
기본 형식 : 명령어1 | 명령어2 | 명령어3
실제 동작 예시
ls -l | grep "txt"
이 명령에서 일어나는 일을 단계별로 살펴보면
1. ls -l이 실행되어 디렉토리 내용을 상세히 출력
2. 이 출력이 파일로 저장되거나 화면에 표시되지 않고 곧바로 grep으로 전달
3. grep이 전달받은 내용에서 "txt"가 포함된 줄만 찾아서 화면에 출력
예시2
$ ps aux | grep "nginx" | wc -l
1. ps aux가 실행 중인 모든 프로세스 목록 생성
2. grep이 그 중에서 "nginx"가 포함된 줄만 필터링
3. wc -l이 최종적으로 줄 수를 세어서 출력
파이프라인의 장점
1. 디스크 사용을 최소화한다 -> 중간 결과를 파일에 저장할 필요가 없음
2. 메모리 사용이 효율적이다. -> 데이터가 스트림으로 처리된다.
3. 복잡한 작업을 간단한 명령어들의 조합으로 해결할 수 있다.