- Redirection
- Pipeline
1. Redirection
일반적으로 Communication Channels이라고 하면 사용자의 입력이 프로그램에 들어가고 프로그램의 결과가 터미널을 통해 출력된다.
입력은 '키보드', 출력은 '터미널'이라는 채널을 통해 전달이 되는데 이 전달 매체를 다른 방법으로 전환하여 전달하도록 하는 것이 Redirection이라고 할 수 있다.
Communication Channels |
Redirection Characters |
의 미 | |
STDIN | 0< | 0<< | 입력을 키보드가 아닌 파일을 통해 받음 |
STDOUT | 1> | 1>> | 표준 출력을 터미널이 아닌 파일로 출력 |
STDERR | 2> | 2>> | 표준 에러 출력을 터미널이 아닌 파일로 출력 |
입력
mailx라는 명령을 통해 localhost에서 유저 간 메일을 주고 받는 과정에서 입력에 대한 Redirection을 쉽게 이해할 수 있다.
# mail이 설치되어있지 않다면 아래 설치 명령 입력
sudo apt-get install mailutils
# 키보드로 입력을 받아 메일 보내기
mailx -s "[메일 제목]" [유저이름]@localhost
# 자유롭게 메일 내용 입력 후 Ctrl + d
위 명령을 입력하면 메일이 localhost 내에 있는 유저에게 전송된다.
우리는 자유롭게 메일 내용을 입력할 때 키보드로 입력하게 된다.
이 입력을 키보드가 아닌 파일로 받게 하는 방법이 있다.
# message.txt파일 생성
echo "Hello, My friend!" > message.txt
# 파일로 메일 보내기
mailx -s "[메일 제목]" [유저이름]@localhost 0< message.txt
# 수신받은 유저쪽으로 접속
su - [유저 이름]
# 메일 확인
mailx
# 프롬프트가 ?로 바뀌면 번호를 입력해서 확인
여기서 중요한 것은 메일을 보냈다는 사실이 아니라 키보드로 받아야할 입력을 파일로 받게 했다는 점이다.
참고로 위 표에서 0과 1은 생략해서 >, >>, <, << 기호만 입력해서 사용할 수 있다.
출력 - 정상
일반적으로 프로그램의 실행결과는 성공을 했든 실패를 했든 간에 터미널에서 출력하여 보여준다.
# 명령어 실행 결과를 date.out에 출력
date 1> date.out
# 1> 명령은 덮어쓰기(overwrite) 1>>는 이어쓰기(append)
date > date.out
date >> date.out
# 내용 출력
cat date.out
# 결과
Tue Nov 21 08:24:49 PM UTC 2023
Tue Nov 21 08:24:55 PM UTC 2023
참고로 위 표에서 0과 1은 생략해서 >, >>, <, << 기호만 입력해서 사용할 수 있다.
출력 - 오류
# 일부러 오류가 출력되도록 잘못된 명령 입력
datfavfnsr
# data는 없는 명령
data
# datfavfnsr 결과
datfavfnsr: command not found
# data 결과
Command 'data' not found, did you mean:
command 'dat' from deb liballegro4-dev (2:4.4.3.1-2)
command 'date' from deb coreutils (8.32-4.1ubuntu1)
Try: sudo apt install <deb name>
# 오류 메시지를 파일로 출력. 이 때 error.txt라는 파일은 없으므로 생성 후 출력
datfavfnsr 2> error.txt
# 오류 메시지를 error.txt 메일로 출력. 이 때 내용을 덮어쓰기 하지 않고 이어서 기록
data 2>> error.txt
# 내용 출력
cat error.txt
# 결과
datfavfnsr: command not found
Command 'data' not found, did you mean:
command 'dat' from deb liballegro4-dev (2:4.4.3.1-2)
command 'date' from deb coreutils (8.32-4.1ubuntu1)
Try: sudo apt install <deb name>
# 디렉토리에 file1만 존재할 경우
ls file1 file2
# 결과
ls: cannot access 'file2': No such file or directory
file1
# 오류결과를 출력하고 싶지 않은 경우
ls file1 file2 2> /dev/null
# 결과
file1
/dev/null 은 소각장 역할이며 해당 위치로 리다이렉션되는 경우 모든 결과는 사라져서 출력되지 않는다.
위에서는 오류 결과에 대해서 /dev/null 에 출력하라고 했으므로 사라지고 성공 결과만 도출된다.
2. Pipeline
Pipeline이란 명령의 실행결과를 다음 명령의 입력으로 전달하는 것이다.
| 기호를 사용하며 리눅스에서 여러 명령을 조합해서 사용한다.
사용방법 : command1 | command2 | command3
# .bashrc의 라인수를 구하는 명령
wc -l .bashrc
# 출력 결과가 몇줄인지 구하는 명령
ls -l | wc -l
# 결과
117 .bashrc
# 결과
7
### pipeline의 다양한 활용
# 현재 디렉토리의 결과를 한페이지씩 보여주는 명령
ls -l | more
# passwd 파일의 내용에서 :을 구분자로 하여 1번째 필드를 정렬하고 중복은 하나만 출력해서 라인수를 구해주는 명령
cat /etc/passwd | cut -d: -f 1 | sort | uniq | wc -l
위 명령어들을 alias로 지정해서 간단히 사용할 수도 있고 다양하게 활용하면 빠르고 쉽게 원하는 결과를 도출하도록 이용할 수 있다.
아래 영상을 참고했습니다.
https://youtube.com/playlist?list=PLApuRlvrZKog2XlvGJQh9KY8ePCvUG7Je&si=MoTLJQMqo4WisyI7
'Shell Script' 카테고리의 다른 글
Shell Script 보안 - 코드 인젝션 취약점 (0) | 2023.11.24 |
---|---|
Shell Script 기초(5) (0) | 2023.11.24 |
Shell Script 기초(4) (0) | 2023.11.24 |
Shell Script 기초(3) (0) | 2023.11.23 |
Shell Script 기초(1) (0) | 2023.11.22 |