| 표기 | 뜻 |
|---|---|
history |
번호 붙은 전체 목록 |
!! |
직전 명령 |
sudo !! |
직전 명령을 sudo 로 |
!$ |
직전 명령의 마지막 인자 |
!123 |
123번 명령 |
!ssh |
ssh 로 시작한 최근 명령 |
| Ctrl+R | 거꾸로 검색 |
Ctrl+R 을 누르고 글자를 치면 일치하는 최근 명령이 나오고, 다시 Ctrl+R 로 더 이전 것, Enter 로 실행, Esc 로 편집합니다. mkdir /opt/myapp/logs 뒤 cd !$ 처럼 !$ 를 쓰면 경로를 다시 치지 않습니다.
# ~/.bashrc
export HISTSIZE=5000
export HISTFILESIZE=10000
export HISTTIMEFORMAT='%F %T 'HISTTIMEFORMAT 을 켜면 history 에 시각이 붙어 "그날 누가 무엇을 쳤나" 가 남습니다. 장애 후 추적에 유용합니다. 히스토리는 셸을 닫을 때 ~/.bash_history 에 저장됩니다.
| 키 | 동작 |
|---|---|
| Ctrl+A / Ctrl+E | 줄 처음 / 끝 |
| Ctrl+U / Ctrl+K | 커서 앞 / 뒤 지우기 |
| Ctrl+W | 앞 단어 지우기 |
| Ctrl+Y | 지운 것 붙여넣기 |
| Ctrl+L | 화면 지우기 |
| Alt+. | 직전 마지막 인자 붙여넣기 |
| Tab | 자동 완성 |
Tab 을 두 번 누르면 후보 목록이 나옵니다. 긴 경로는 앞 몇 글자만 치고 Tab 으로 완성하는 것이 오타를 막는 가장 좋은 방법입니다.
| 키 | 동작 |
|---|---|
| Ctrl+C | 실행 중단 |
| Ctrl+Z | 멈춤, bg·fg 로 이어감 |
| Ctrl+D | 입력 끝, 빈 줄에서는 셸 나가기 |
| Ctrl+S / Ctrl+Q | 화면 멈춤 / 재개 |
Ctrl+S 를 실수로 누르면 화면이 멈춘 것처럼 보입니다. Ctrl+Q 로 풉니다. "터미널이 멈췄다" 의 흔한 원인입니다.
alias ll='ls -la'
alias ..='cd ..'
alias grep='grep --color=auto'
alias # 목록
unalias ll # 해제
\ls # 별칭 무시하고 원래 명령~/.bashrc 에 적고 source ~/.bashrc 로 반영합니다. alias rm='rm -i' 처럼 위험한 명령에 확인을 붙이는 용도로도 씁니다. 스크립트 안에서는 별칭이 기본으로 꺼져 있어 함수를 씁니다.
echo file{1..3}.txt # file1.txt file2.txt file3.txt
echo {a,b}{1,2} # a1 a2 b1 b2
mkdir -p app/{conf,logs,bin}
cp app.yml{,.bak} # cp app.yml app.yml.bak
mv app.yml{.bak,} # 되돌리기{,.bak} 은 빈 것과 .bak 두 개로 펼쳐져 백업 한 줄이 됩니다. 이 확장은 파일이 있든 없든 문자열만 만듭니다.
| 패턴 | 뜻 |
|---|---|
* |
아무 글자 0개 이상 |
? |
아무 글자 1개 |
[1-3] |
범위 중 하나 |
[!a] |
a 가 아닌 하나 |
** |
하위 폴더까지 (shopt -s globstar) |
글로브는 실제 존재하는 파일 이름으로 펼쳐집니다. ls *.log 는 셸이 먼저 목록을 만들어 ls 에 넘기고, find -name '*.log' 는 따옴표로 막아 find 가 직접 처리합니다. 일치하는 파일이 없으면 패턴 문자열이 그대로 남습니다.
NAME=world; echo "hello $NAME"; echo 'hello $NAME' # 큰따옴표만 확장
TODAY=$(date +%F)
COUNT=$(ls logs | wc -l); echo $((COUNT * 2))
echo "${NAME^^} ${NAME:0:3} ${#NAME}" # 대문자, 부분, 길이
echo "${UNSET:-기본값}"작은따옴표는 아무것도 펼치지 않고 큰따옴표는 $ 만 펼칩니다. 운영 묶음 08 의 확장 문법 위에 ^^ 대문자, :0:3 부분 문자열이 추가됐습니다.
ls app > list.txt 2>&1 # 출력과 에러 모두 파일로
ls 없음 2>/dev/null || echo "에러 숨김"
ls app | tee copy.txt | wc -l # 화면으로 넘기면서 파일에도
ls logs | xargs -n 2 echo # 2개씩 인자로
find . -name '*.log' -print0 | xargs -0 wc -l
grep -c log <<< "app.log" # here-stringtee 는 파이프 중간 결과를 저장하면서 계속 넘깁니다. xargs -n 은 인자 개수를 제한하고 -I{} 는 자리를 지정합니다.
true; echo $? # 0
mkdir -p x && echo "성공 시"
ls 없음 || echo "실패 시"
echo a; echo b # 무조건 둘 다
(cd app && pwd); pwd # ( ) 서브셸은 밖에 영향 없음&& 와 || 로 이으면 if 없이 조건 실행이 됩니다. 괄호 서브셸은 cd 나 변수 변경을 밖으로 새지 않게 합니다.
for f in *.log; do gzip "$f"; done
for i in $(seq 1 3); do curl -s localhost:8080/health; sleep 1; done
for h in app1 app2; do ssh "$h" uptime; done
watch -n 2 'ss -s' # 2초마다 갱신, Ctrl+C 로 나감
seq -w 1 10 # 01 02 ... 10한 줄 for 는 do·done 사이에 명령을 넣고 ; 로 구분합니다. watch 는 같은 명령을 반복해 화면을 갱신하므로 배포 중 연결 수나 로그 크기를 지켜볼 때 씁니다.
| 명령·키 | 동작 |
|---|---|
tmux new -s deploy |
이름 붙여 새 세션 |
| Ctrl+B d | 떼어 두기 |
tmux ls |
세션 목록 |
tmux attach -t deploy |
다시 붙기 |
| Ctrl+B c / n / p | 창 새로 / 다음 / 이전 |
접속이 끊겨도 세션 안 작업은 계속 돕니다. 마이그레이션, 대용량 복사, 긴 배포는 반드시 tmux 안에서 시작합니다. 없으면 screen -S, Ctrl+A d, screen -r 이 같은 역할입니다.