Shell Script

Shell Script 기초(2)

사실 나도 모름 2023. 11. 22. 06:00
  1. Redirection
  2. 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

 

[따배셸] 셸 프로그래밍 시리즈

 

www.youtube.com

 

'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