OS

[따배셸] 3. Bash Shell과 Rules

noahkim_ 2025. 3. 31. 22:26

이성미 님의 "[따배셸] 셸 프로그래밍 시리즈" 강의를 정리한 글입니다.

 

1. Quoting Rule

Metacharacters

  • Shell에서 특별히 의미를 정해놓은 문자들

 

메타 문자 설명 예시
* 모든 문자에 해당 (와일드카드로 사용 가능) *.txt → 모든 .txt 파일
? 임의의 단일 문자에 해당 file?.txt → file1.txt, fileA.txt
{a..b} a부터 b까지의 문자 집합 정의 {a..c} → a, b, c
[] 대괄호 안의 문자 중 하나와 일치 file[123].txt → file1.txt, file2.txt, file3.txt
! 명령어 내에서 논리 부정 (이 명령어가 쓰인 위치에서 사용) !file → file이 아닌 모든 파일
| 파이프(pipe)
명령어의 출력을 다른 명령어의 입력으로 전달
cat /etc/passwd | grep user
& 백그라운드에서 명령어 실행 command &
; 명령어를 순차적으로 실행
한 줄에 여러 명령어를 실행
command1; command2; command3
() 서브쉘 (괄호 안의 명령어는 새로운 쉘에서 실행됨) (command1; command2)
&& 앞 명령어가 성공하면 뒤 명령어 실행 command1 && command2
|| 첫 번째 명령어가 실패하면 두 번째 명령어를 실행합니다. command1 || command2
> 출력 리다이렉션 (파일로 출력) echo "Hello" > file.txt
< 입력 리다이렉션 (파일로부터 입력) sort < file.txt
>> 출력 리다이렉션 (파일에 덧붙이기) echo "Hello again" >> file.txt
<< 히어 독 (문자열을 직접 입력하여 명령어에 전달) cat << EOF
Hello
EOF
\ 특수 문자의 이스케이프 (특수 문자의 의미를 제거) \*, \?, \\

 

Quoting Rule

  • 메타 문자의 의미를 제거하고 단순 문자로 변경

 

규칙 설명 예시
\ 뒤에 나오는 메타 문자의 특별한 의미를 제거 \*, \? → *, ?
"" 큰따옴표 내의 메타 문자는 특별한 의미를 제거
단, Nesting Command 의미는 살려둠
"file*.txt" → 문자 그대로 취급
echo "Today $(date)"
-> Today: Mon Mar 31 21:51:29 KST 2025
' 작은따옴표 내의 모든 문자는 메타 문자의 특별한 의미를 제거 file*.txt' → 문자 그대로 취급

 

2. Nesting Commands

Command 치환

  • 명령어의 실행 결과를 치환하여 명령을 실행

 

Nesting Commands

echo "Today: $(date)"
echo "Today: `date`"

touch report-$(date +%Y%m%d)

 

3. Aliases

  • Shell 명령에 새로운 이름을 부여함

 

명령어 설명 예시
alias 특정 명령어를 다른 명령어로 치환할 수 있도록 설정 alias (별명 목록)
alias rm='rm -i' (별명 등록)
unalias 설정한 alias를 삭제 unalias rm

 

4. Prompt

  • 프롬프트 내용 설정을 위한 특수 문자열

 

문자열 설명 예시
\u 현재 사용자의 사용자명 user1 (현재 사용자가 user1인 경우)
\h 현재 호스트 이름의 첫 번째 부분 hostname (현재 호스트 이름이 hostname인 경우)
\w 현재 작업 중인 디렉터리의 절대 경로 /home/user1 (현재 디렉터리가 /home/user1인 경우)
\d 현재 날짜 (요일 포함) Mon Mar 31 (현재 날짜가 3월 31일인 경우)
\t 현재 시간 (24시간 형식) 14:30:00 (현재 시간이 14시 30분 0초인 경우)
\A 현재 시간 (24시간 형식, 초는 제외) 14:30 (현재 시간이 14시 30분인 경우)
\@ 현재 시간 (12시간 형식) 2:30 PM (현재 시간이 14시 30분인 경우)
\$ 사용자 권한을 표시 $ (일반 사용자일 때)
# (관리자일 때)
\n 줄바꿈 프롬프트가 다음 줄에 출력됩니다
\! 명령 번호 (history 번호) 1234 (현재 명령 번호가 1234인 경우)

 

5. Redirection

Communication Channel

  • 프로그램은 쉘을 통해 stdin(0)으로 입력받고 stdout(1,2)로 출력함

 

Redirection

  • 입출력 채널을 바꿀 수 있음

 

기호 설명 예시
< 0번(stdin)의 입력을 파일을 통해 받기 mailx -s "TEST MAIL" user1.localhost < message.txt
> 1번(stdout)의 출력을 파일로 저장하기 date > date.out
>> 1번(stdout)의 출력을 파일에 이어붙이기 date >> date.out
2> 2번(stderr)의 출력을 파일로 저장하기 ls notexists.txt 2> error.txt
2>/dev/null 2번(stderr)의 출력을 /dev/null로 보내서 출력하지 않기 ls exists.txt notexists.txt 2> /dev/null
-> exists.txt만 출력됨
  • /dev/null는 버려지는 출력 채널

 

6. Pipeline

  • 명령의 실행 결과를 다음 명령의 입력으로 전달
ls -l | wc -l  # 디렉토리의 개체 라인 수 출력
cat /etc/passwd | cut -d: -f 1 | wc -l # 유저 수 출력

 


출처