이성미 님의 "[따배셸] 셸 프로그래밍 시리즈" 강의를 정리한 글입니다.
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 # 유저 수 출력
출처
'OS' 카테고리의 다른 글
[따배셸] 4. Bash Shell Script (0) | 2025.03.31 |
---|---|
[따배셸] 2. Bash Shell과 변수 (0) | 2025.03.31 |
[따배셸] 1. Linux Shell 이란? (0) | 2025.03.31 |
[쉽게 배우는 운영체제] 11. 파일 시스템 (3) | 2024.12.14 |
[쉽게 배우는 운영체제] 9. 가상 메모리 관리 (0) | 2024.12.13 |