리디렉션(Redirection)
리눅스에서 리디렉션과 파이프라인은 명령어의 입출력을 제어하는 기능으로, 데이터 흐름을 원하는 방식으로 연결하고 처리할 수 있게 해준다.
리디렉션은 명령어의 입력 또는 출력을 특정 파일로 보내거나, 파일에서 데이터를 읽어오는 기능이다. 보통 >, <, >> 기호를 사용한다.
기호 | 설명 | 예시 |
---|---|---|
> | 표준 출력을 파일로 리디렉트(덮어쓰기) | ls > file.txt (출력을 file.txt로 저장) |
>> | 표준 출력을 파일로 리디렉트(추가) | echo "Hello" >> file.txt (file.txt에 추가) |
< | 파일을 표준 입력으로 리디렉트 | cat < file.txt (file.txt 내용을 출력) |
2> | 표준 에러 출력을 파일로 리디렉트 | ls nonexistent 2> error.txt |
2>> | 표준 에러 출력을 파일로 리디렉트(추가) | ls nonexistent 2>> error.txt |
&> | 표준 출력과 표준 에러 출력을 동시에 리디렉트 | ls &> output.txt |
<< | 명령어의 여러 줄 입력을 표준 입력으로 리디렉트 | cat << EOF Line 1 Line 2 EOF |
<<< | 여러 줄이 아닌 단일 문자열을 표준 입력으로 리디렉트 | bc <<< "10 + 5" |
스트림을 대상 파일에 저장
-표준 출력 스트림 번호: 1
-표준 에러 스트림 번호: 2
-생략 시 표준 출력
출력을 파일로 저장
ls > output.txt
ls 명령어의 결과가 output.txt 파일에 저장된다. 파일이 없을 경우 새로 생성하고, 기존 파일이 있을 경우 덮어쓴다.
noclobber 옵션 설정 시, 덮어쓰기 시도를 하면 에러가 발생함 하지만 ">|" 사용시 noclobber 옵션 설정 여부와 관계없이 덮어쓰기 성공함
ls >| output.txt
출력을 파일에 추가
echo "Hello" >> output.txt
echo 명령어의 결과가 output.txt 파일 끝에 추가된다.
표준 에러 리디렉션
명령어 에러의 내용은 파일에 저장되지 않는데, 이때 에러의 내용을 사용하고 싶다면 아래와 같이 입력하면 된다.
ls nonexistentfile 2> error.txt
ls 명령어의 오류 메시지를 error.txt에 저장한다.
출력과 오류를 모두 리디렉션
>&를 사용하면 표준 출력과 표준 오류를 동시에 파일로 리디렉션할 수 있다.
ls /없는_경로 &> output.txt
output.txt 파일에 표준 출력과 표준 오류가 모두 저장된다.
ls /없는_경로 > output.txt 2>&1
이 명령어도 똑같은 기능을 수행한다 2>&1 의 뜻은 2번 스트림(표준 오류)가 있다면, 1번 스트림(표준 출력)으로 리디렉션 하라는 뜻이다.
이 방식은 파일 디스크립터로 리디렉션하는 방식이다.
파일을 표준 입력으로 리디렉트
cat < file.txt
file.txt 파일의 내용을 cat 명령어의 입력으로 제공하여 파일 내용을 출력한다.
wc -l < file.txt
file.txt 파일의 내용을 wc -l 명령어에 전달하여 파일의 라인 수를 계산한다.
Here 문법으로 여러 줄 입력을 리디렉트
<<는 Here 문법을 사용하여 여러 줄의 입력을 한꺼번에 명령어로 리디렉트할 때 사용된다.
보통 EOF 또는 END 같은 종료 문자열을 지정하며, 지정한 문자열을 만날 때까지 입력을 계속 받는다.
cat << EOF
Line 1
Line 2
Line 3
EOF
EOF 사이에 있는 여러 줄이 cat 명령어에 입력으로 전달되어 출력된다.
종료 문자열(EOF)은 아무 문자열로 지정할 수 있으며, 종료할 때는 반드시 해당 문자열로 종료해야 한다.
Here 문자열로 단일 문자열을 리디렉트
<<<는 Here 문자열을 사용하여 단일 문자열을 명령어의 표준 입력으로 리디렉트할 때 사용된다.
문자열 하나만 간단히 입력하고자 할 때 유용하다.
bc <<< "10 + 5"
bc(기본 계산기)에 10 + 5라는 문자열을 전달하여 계산한다. 결과로 15가 출력된다.
파이프라인(Pipeline)
리눅스에서 파이프라인은 여러 명령어를 연결하여 그 결과를 연속적으로 처리할 수 있게 해주는 기능이다.
파이프라인을 사용하면 한 명령어의 출력을 다음 명령어의 입력으로 전달할 수 있어 복잡한 작업을 간단하게 수행할 수 있다.
파이프라인은 보통 | 기호를 사용하여 명령어를 연결한다.
파이프라인의 기본 원리는 한 명령어의 출력을 다른 명령어의 입력으로 사용하는 것이다.
이를 통해 중간에 파일을 사용하지 않고 여러 명령어의 결과를 처리할 수 있다.
파이프라인은 데이터를 효율적으로 조작하고 분석하는 데 유용하며, 텍스트 처리 및 필터링에 자주 사용된다.
ps -ef | grep "root" | grep "scsi"
이 명령어는 현재 시스템에서 실행 중인 프로세스 중 root 사용자가 실행한 scsi와 관련된 프로세스만을 찾기 위해 사용된다.
- ps -ef : 현재 시스템에서 실행 중인 모든 프로세스를 보여준다.
- | grep "root" : ps -ef 명령어의 출력 결과에서 root라는 문자열을 포함하는 줄만 필터링한다.
- | grep "scsi" : 이전 필터링 결과에서 추가적으로 scsi라는 문자열을 포함하는 줄만 다시 필터링한다.
최종 결과로는 root 사용자가 실행한 프로세스 중 scsi와 관련된 프로세스만 출력된다.
위 그림에서 Program 1, Program 2, Program 3은 서로 파이프라인으로 연결되어 있다.
파이프라인을 사용하여 한 프로그램의 출력을 다음 프로그램의 입력으로 연결할 수 있다.
Program 1의 표준 출력(stdout)이 Program 2의 표준 입력(stdin)으로 전달되는 방식이다.
이런 연결을 통해 여러 프로그램이 순차적으로 데이터를 처리할 수 있다.
각각 command(위 그림에서는 Program)는 sub-shell에서 실행되고, 전체 파이프라인의 exit status는 마지막 실행 커맨드의 exit status이다.
즉, 커맨드가 3개 있다고 하면 앞에 2개가 성공해도 마지막 커맨드가 실패하면 exit status는 0이 아니다.
반대로 앞에 2개가 실패해도 마지막 커맨드가 성공하면 exit status는 0이다.
하지만 pipefail 옵션이 설정되어 있다면 하나라도 실패한 커맨드가 존재하면 전체 실패로 처리된다.
(set -o pipefail; 명령어 | 다른_명령어 | 또_다른_명령어)
또한 |& 기호를 사용하면 표준 출력 뿐만아니라 표준 에러가 다음 입력으로 연결된다.
command1 |& command2
command1의 표준 출력과 표준 오류가 모두 command2의 표준 입력으로 전달된다.
이는 command1 2>&1 | command2와 동일한 효과를 가진다.
여기서 2>&1은 표준 오류(stderr)를 표준 출력(stdout)으로 리디렉트하여, 파이프라인을 통해 전달될 수 있도록 만든다.
'컴퓨터 구조 & 운영체제 > Linux' 카테고리의 다른 글
[Bash 스크립트] Bash 스크립트 기본 개념과 변수 (0) | 2024.11.10 |
---|---|
[Linux] 프로세스 관련 명령어 (0) | 2024.11.08 |
[Linux] 프로세스와 시그널 (0) | 2024.11.08 |
[Linux] 스크립트 작성 및 실행 (0) | 2024.11.07 |
[Linux] 사용자와 그룹 (0) | 2024.11.07 |