[CLI] ์ ์ฉํ ์ ธ(Shell) ํฐ๋ฏธ๋ ๋จ์ถํค/ํ ๋ชจ์
์ ธ ๊ณตํต ๊ธฐ๋ฅ
๋ผ์ธ ํธ์ง ๋จ์ถํค
Ctrl + W : ์ปค์ ์ ๋จ์ด ์๋ผ๋ด๊ธฐ
# Before
Excepteur sit est non sed excepteur in commodo.|
# After
Excepteur sit est non sed excepteur in |
Ctrl + U : ์ปค์๋ถํฐ ์ค ์์๊น์ง ์๋ผ๋ด๊ธฐ
# Before
Excepteur sit est non sed excepteur in commodo.|
# After (์ปค์ ์ ๋ด์ฉ ๋ค ์ง์์ง)
|
Ctrl + K : ์ปค์๋ถํฐ ์ค ๋๊น์ง ์๋ผ๋ด๊ธฐ
# Before
Excepteur |sit est non sed excepteur in commodo.
# After
Excepteur |
Ctrl + Y : ๊ฐ์ฅ ์ต๊ทผ์ ์๋ผ๋ธ ๋ด์ฉ ๋ถ์ฌ๋ฃ๊ธฐ
# Before
Excepteur sit est non sed excepteur in |
# After
Excepteur sit est non sed excepteur in commodo.|
Ctrl + A : ์ค ๋งจ ์์ผ๋ก ์ด๋
# Before
Excepteur sit est non sed excepteur in commodo.|
# After
|Excepteur sit est non sed excepteur in commodo.
Ctrl + E : ์ค ๋งจ ๋์ผ๋ก ์ด๋
# Before
|Excepteur sit est non sed excepteur in commodo.
# After
Excepteur sit est non sed excepteur in commodo.|
Alt + B : ๋จ์ด ๋จ์๋ก ๋ค๋ก ์ด๋
# Before
Excepteur sit est non sed excepteur in commodo.|
# After
Excepteur sit est non sed excepteur in |commodo.
Alt + F : ๋จ์ด ๋จ์๋ก ์์ผ๋ก ์ด๋
# Before
Excepteur |sit est non sed excepteur in commodo.
# After
Excepteur sit |est non sed excepteur in commodo.
ํฐ๋ฏธ๋ ๋ณต๊ตฌ
๊ธ์๊ฐ ๋ณด์ด์ง ์๊ฑฐ๋, ์ค๋ฐ๊ฟ์ด ์ด์ํด์ง๊ฑฐ๋, ํ๋ฉด ํ์๊ฐ ๊นจ์ก๊ฑฐ๋, ์ด๋ค ํ๋ก๊ทธ๋จ์ด ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋ฉด์ ํฐ๋ฏธ๋ ์ํ๊ฐ ๊ผฌ์์ ๋ ์ ์ฉํ ๋ณต๊ตฌ ๋ช ๋ น์ด.
# ํฐ๋ฏธ๋ ์ํ ์ด๊ธฐํ
reset
# ํฐ๋ฏธ๋ ์
๋ ฅ ์ค์ ๋ณต๊ตฌ
stty sane
๊ธด๊ธ ์ ์ด
Ctrl + C: ํ์ฌ ํฌ๊ทธ๋ผ์ด๋์์ ์คํ ์ค์ธ ๋ช ๋ น ์ค๋จCtrl + D: EOF(End of File; ๋ ์ด์ ์ ๋ ฅํ ๋ด์ฉ ์์) ์ ์ก.cat์ฒ๋ผ ์ ๋ ฅ์ ๊ธฐ๋ค๋ฆฌ๋ ํ๋ก๊ทธ๋จ์ด๋ python ๊ฐ์ ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ข ๋ฃํ ๋ ์์ฃผ ์ฌ์ฉํ๋ค.
ํ๋ฉด ์ ๋ฆฌ
Ctrl + L: ํฐ๋ฏธ๋ ํ๋ฉด ์ ๋ฆฌ- macOS ํฐ๋ฏธ๋์์
Command + K๋จ์ถํค๋ก๋ ๊ฐ๋ฅ
๋๋ ํฐ๋ฆฌ ์ด๋
cd -: ๋ฐ๋ก ์ด์ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋pushd [๊ฒฝ๋ก]: ํ์ฌ ๋๋ ํฐ๋ฆฌ๋ฅผ ์คํ์ ์ ์ฅํ๊ณ ์ง์ ํ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋popd: ์ ์ฅํด ๋ ๋๋ ํฐ๋ฆฌ๋ก ๋ณต๊ท (๋๋ ํฐ๋ฆฌ ์คํ์ ๋งจ ์ ๊ฒฝ๋ก)
ํ์ผ ๋น์ฐ๊ธฐ
> ํ์ผ๋ช
: ํ์ผ์ ์ญ์ ํ์ง ์๊ณ ๋ด์ฉ๋ง ๋น์
echo "Hello World" > hello.txt
cat hello.txt
# Hello World
> hello.txt
cat hello.txt
# (๋ด์ฉ์์)
์ด์ ๋ช ๋ น์ ๋ง์ง๋ง ์ธ์ ์ฌ์ฌ์ฉ
$_ : ์ง์ ๋ช
๋ น์ ๋ง์ง๋ง ์ธ์ ์ฐธ์กฐ (ํ์คํ ๋ฆฌ์๋ ๊ฐ ๋
ธ์ถ ์์ด $_ ์ผ๋ก ๊ธฐ๋ก๋จ, ์คํฌ๋ฆฝํธ์์๋ ์ฌ์ฉ ๊ฐ๋ฅ)
mkdir -p project/src
cd $_
pwd
# project/src
์ ธ ์คํฌ๋ฆฝํธ ์์ ์ฅ์น
set -e: ๋ช ๋ น ์คํจ ์ ์คํฌ๋ฆฝํธ ์ข ๋ฃset -u: ์ ์๋์ง ์์ ๋ณ์ ์ฌ์ฉ ์ ์๋ฌset -o pipefail: ํ์ดํ๋ผ์ธ ์ค๊ฐ ๋ช ๋ น์ ์คํจํ๋ฉด ์ ์ฒด๋ฅผ ์คํจ๋ก ์ฒ๋ฆฌ
Bash / Zsh ๊ธฐ๋ฅ
ํ์คํ ๋ฆฌ ๊ฒ์
Ctrl + R : ์ด์ ์ ์คํํ ๋ช
๋ น์ ํ์คํ ๋ฆฌ์์ ์ญ๋ฐฉํฅ์ผ๋ก ๊ฒ์
๋ช ๋ น ์ฌ์ฌ์ฉ
!! : ์ง์ ๋ช
๋ น์ด ๋ค์ ์คํ
pwd
# /Users/me/project
!!
# pwd
# /Users/me/project
์๋ํฐ๋ก ๋ช ๋ น ํธ์ง
Ctrl + X, Ctrl + E : ํ์ฌ ์
๋ ฅ ์ค์ธ ๋ช
๋ น์ ์๋ํฐ๋ก ์ด๊ธฐ
# ํฐ๋ฏธ๋์ ๊ธด ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ค๊ฐ...
git commit -m "fix: adjust shell shortcut docs and add editor examples"
# Ctrl + X, Ctrl + E ๋จ์ถํค๋ฅผ ๋๋ฅด๋ฉด
# ์
๋ ฅ ์ค์ด๋ ๋ด์ฉ์ด ์๋ํฐ์์ ์ด๋ฆผ
# ์๋ํฐ์์ ์์ ํ ๋ค ์ ์ฅํ๊ณ ์ข
๋ฃํ๋ฉด
# ์์ ๋ ๋ด์ฉ์ด ํฐ๋ฏธ๋ ์
๋ ฅ์ฐฝ์ ๋ฐ์๋จ
fc : ์ด์ ๋ช
๋ น์ $EDITOR์์ ํธ์ง
# ์ง์ ์ ์คํํ ๋ช
๋ น
git rebase -i HEAD~5
# ๋ค์ ์์ ํด์ ์คํํ๊ณ ์ถ์ ๋
fc
# ๋ฐฉ๊ธ ์คํํ ๋ช
๋ น์ด ์๋ํฐ์์ ์ด๋ฆผ
# HEAD~10์ผ๋ก ๊ณ ์น ๋ค ์ ์ฅํ๊ณ ์ข
๋ฃํ๋ฉด
# ์์ ํ ๋ช
๋ น์ด ๋ค์ ์คํ๋จ
์ด์ ๋ช ๋ น์ ๋ง์ง๋ง ์ธ์ ๊ฐ์ ธ์ค๊ธฐ
Esc + . ๋๋ Alt + . : ์ง์ ๋ช
๋ น์ ๋ง์ง๋ง ์ธ์๋ฅผ ํ์ฌ ์ปค์ ์์น์ ์ฝ์
mkdir -p project/src
cd
# ์ฌ๊ธฐ์ Alt + .
# project/src ๊ฐ ์๋์ผ๋ก ์
๋ ฅ๋จ
!$ : ์ง์ ๋ช
๋ น์ ๋ง์ง๋ง ์ธ์ ์ฐธ์กฐ (ํ์คํ ๋ฆฌ์๋ ์ค์ ๊ฐ์ผ๋ก ์นํ๋์ด ๊ธฐ๋ก๋จ, ์
ธ ์ ์ฉ)
mkdir -p project/src
cd !$
pwd
# project/src
์ค๊ดํธ ํ์ฅ (Brace Expansion)
{} ์์ ๊ฐ์ด๋ ๋ฒ์๋ฅผ ๋ฃ์ด ์ฌ๋ฌ ๋ฌธ์์ด์ ํ ๋ฒ์ ์์ฑํ ์ ์๋ ๊ธฐ๋ฅ. ์ผํ(,)๋ ์ฌ๋ฌ ๊ฐ์ ๋์ดํ ๋ ์ฌ์ฉํ๊ณ , .. ๋ ์ฐ์๋ ๋ฒ์๋ฅผ ์ง์ ํ ๋ ์ฌ์ฉํ๋ค.
echo file{1,2,3}.txt
# file1.txt file2.txt file3.txt
mkdir -p project/{src,dist,public}
# project/src project/dist project/public ๋๋ ํฐ๋ฆฌ ์์ฑ
echo {1..5}
# 1 2 3 4 5
echo {a..d}
# a b c d
ํ๋ก์ธ์ค ์นํ (Process Substitution)
๋ช
๋ น์ด์ ์ถ๋ ฅ์ ์์ ํ์ผ์ฒ๋ผ ๋ค๋ฃฐ ์ ์๋ ๊ธฐ๋ฅ. <(๋ช
๋ น์ด)๋ ์คํ ๊ฒฐ๊ณผ๋ฅผ ํ์ผ์ฒ๋ผ ์ฝ์ ์ ์๊ฒ ํ๊ณ (read), >(๋ช
๋ น์ด)๋ ์ถ๋ ฅ์ ํ์ผ์ ์ฐ๋ฏ(write) ๋ค๋ฅธ ๋ช
๋ น์ผ๋ก ๋ณด๋ผ ์ ์๊ฒ ํ๋ค.
# ์์ ํ์ผ ์์ฑ ์์ด, ๋ ๋๋ ํฐ๋ฆฌ์ ํ์ผ ๋ชฉ๋ก ์ฐจ์ด๋ฅผ ๋ฐ๋ก ๋น๊ต
diff <(ls dirA) <(ls dirB)
# ๊ฐ ๋ช
๋ น์ด์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ํ
์คํธ ํ์ผ์ฒ๋ผ ์ด์ด์ ์ถ๋ ฅ
cat <(echo "hello") <(echo "world")
# hello
# world
# app.log ๋ด์ฉ์ ์ถ๋ ฅํ๋ฉด์ ERROR ์ค๋ง error.log์ ์ ์ฅ
tee >(grep "ERROR" > error.log) < app.log
# tee: ์
๋ ฅ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด(stdout)๊ณผ ๋ค๋ฅธ ์ถ๋ ฅ ๋์์ผ๋ก ๋์์ ๋ณด๋
# ํ๋ฆ: app.log ์ฝ๊ธฐ → ํ๋ฉด์ ์ ์ฒด ์ถ๋ ฅ → ๋์์ grep์ผ๋ก ๋๊ฒจ ERROR๋ง ๋ฐ๋ก ์ ์ฅ
๊ธ๋ก๋ธ ํจํด (Glob Pattern)
ํ์ผ ๊ฒฝ๋ก๋ฅผ ํจํด์ผ๋ก ๋งค์นญํ๋ ๊ธฐ๋ฅ. *๋ ํ์ฌ ๋๋ ํฐ๋ฆฌ ์์ค์์ ๋งค์นญํ๊ณ , **๋ ํ์ ๋๋ ํฐ๋ฆฌ๊น์ง ์ฌ๊ท์ ์ผ๋ก ํ์ํ๋ค. bash์์ **๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด shopt -s globstar ๋ช
๋ น์ด๋ก globstar ์ต์
์ ํ์ฑํํด์ผ ํ๋ค. zsh์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก **๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
# ํ์ฌ ๋๋ ํฐ๋ฆฌ์ .js ํ์ผ ์ถ๋ ฅ
echo *.js
# ํ์ฌ ๋๋ ํฐ๋ฆฌ์ ๋ชจ๋ ํ์ ๋๋ ํฐ๋ฆฌ์ .js ํ์ผ ์ถ๋ ฅ
echo **/*.js
# ๋ชจ๋ ํ์ ๋๋ ํฐ๋ฆฌ์ .md ํ์ผ ์ถ๋ ฅ
ls **/*.md
# src์ ๋ชจ๋ ํ์ ๋๋ ํฐ๋ฆฌ์์ .ts ํ์ผ์ ์ฐพ์ dist๋ก ๋ณต์ฌ
cp src/**/*.ts dist/
์์ ์ ์ด (Job Control)
์คํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ์ผ์ ์ค์งํ๊ฑฐ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ณ์ ์คํํ๋ ๊ธฐ๋ฅ. Ctrl + Z ๋จ์ถํค๋ก ํ์ฌ ํฌ๊ทธ๋ผ์ด๋ ์์
์ ์ผ์ ์ค์งํ ์ ์๊ณ , bg ๋ช
๋ น์ด๋ก ์ค์งํ ์์
์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฌ๊ฐํ ์ ์๋ค. ๋ฐ๋๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์ ๋ค์ ํฌ๊ทธ๋ผ์ด๋๋ก ๊ฐ์ ธ์ฌ ๋ fg๋ฅผ ์ฌ์ฉํ๋ค. ํ์ฌ ์
ธ์ด ๊ด๋ฆฌ ์ค์ธ ์์
๋ชฉ๋ก์ jobs๋ก ํ์ธํ ์ ์๋ค.
ํฐ๋ฏธ๋์ ์ข
๋ฃํด๋ ์์
์ ๊ณ์ ์คํํ๊ฒ ๋ง๋๋ ค๋ฉด ์์
์ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๋ณด๋ธ ๋ค disown ๋ช
๋ น์ ์ฌ์ฉํ๋ฉด ๋๋ค. disown์ ํน์ ์์
์ ์
ธ ์์
๋ชฉ๋ก์์ ์ ๊ฑฐํด์ ์
ธ ์ข
๋ฃ ์ ์ ์ก๋๋ SIGHUP ์๊ทธ๋(์ฐ๊ฒฐ์ด ๋๊ฒผ๋ค๊ณ ์๋ฆฌ๋ ์ ํธ)์ ๋ฐ์ง ์๋๋ก ๋ง๋ ๋ค.
disown์ผ๋ก ๋ถ๋ฆฌํ ์์
์ jobs์ ๋ ์ด์ ํ์๋์ง ์์ผ๋ฏ๋ก ps๋ pgrep์ผ๋ก ์คํ ์ฌ๋ถ๋ฅผ ํ์ธํด์ผ ํ๋ค.
# ์คํ ์ค์ธ ํ๋ก์ธ์ค ์ผ์ ์ค๋จ
node server.js
^Z
# [1]+ Stopped node server.js
# ์ค๋จ๋ ์์
์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๊ณ์ ์คํ
bg %1
# [1]+ node server.js &
# ํ์ฌ ์์
๋ชฉ๋ก ํ์ธ
jobs
# [1]+ Running node server.js &
# ์
ธ์ ๋ซ์๋ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋์ง ์๋๋ก ์์
๋ชฉ๋ก์์ ์ ๊ฑฐ
disown %1
๐ก ๋ช
๋ น์ด ๋ค์ &๋ฅผ ๋ถ์ด๋ฉด ์ฒ์๋ถํฐ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํ ์๋ ์๋ค.
pnpm start:dev &
์ถ๋ ฅ ๋ชจ๋ํฐ๋ง๊ณผ ๋ก๊ทธ ์ ์ฅ
|&๋ ํ์ค ์ถ๋ ฅ(stdout)๊ณผ ํ์ค ์๋ฌ ์ถ๋ ฅ(stderr)์ ํฉ์น ํ ๋ค์ ๋ช
๋ น์ด๋ก ์ ๋ฌ(ํ์ดํ)ํ๋ ๋ฌธ๋ฒ์ด๋ค. tee ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ถ๋ ฅ ๋ด์ฉ์ ํ๋ฉด์ ํ์ํ๋ฉด์ ํ์ผ๋ก๋ ์ ์ฅํ ์ ์๋ค.
# stdout๊ณผ stderr๋ฅผ ํ๋ฉด์ ์ถ๋ ฅํ๋ฉด์ all.log์ ์ ์ฅ
command |& tee all.log
# ๊ธฐ์กด ๋ก๊ทธ ํ์ผ ๋์ ์ด์ด์ ์ ์ฅ (-a: append)
command |& tee -a all.log
# ๋น๋ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฉด์ ๋ณด๋ฉด์ ๋ก๊ทธ ํ์ผ์๋ ์ ์ฅ
pnpm build |& tee build.log
# ์๋ฒ ๋ก๊ทธ๋ฅผ ํ๋ฉด์ ์ถ๋ ฅํ๋ฉด์ ๊ธฐ์กด ํ์ผ ๋์ ๊ณ์ ์ถ๊ฐ
pnpm start:dev |& tee -a server.log
๐ก |&๋ Bash 4+์ zsh์์ ์ง์ํ๋ ๋จ์ถ ๋ฌธ๋ฒ์ผ๋ก, 2>&1 | ๋์๊ณผ ๋์ผํ๋ค. sh ์คํฌ๋ฆฝํธ๋ ๊ตฌํ ํ๊ฒฝ์์๋ 2>&1 |๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
# |& ์ ๋์ผํ ๋์
pnpm build 2>&1 | tee build.log
๋ ํผ๋ฐ์ค
Shell Tricks That Actually Make Life Easier (And Save Your Sanity)
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [OS] ํ๋ ๋งํฌ, ์ฌ๋ณผ๋ฆญ ๋งํฌ ์ฐจ์ด์ (0) | 2025.10.19 |
|---|---|
| [JS] ๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ ๊ณ์ฐํ๊ธฐ (0) | 2025.07.20 |
| [CS] ๋ฒ ์ง์ ๊ณก์ ์๋ฆฌ ์ดํดํ๊ธฐ feat. ์นด์คํ ์กฐ ์๊ณ ๋ฆฌ์ฆ (0) | 2025.06.23 |
| [JS] async ํจ์๊ฐ await๋ฅผ ๋ง๋ฌ์ ๋ ๋์ ํ๋ฆ (1) | 2025.06.14 |
| [CSS] grid-row ๋์ ๋ฐฉ์ ์ดํด๋ณด๊ธฐ (0) | 2025.06.03 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[OS] ํ๋ ๋งํฌ, ์ฌ๋ณผ๋ฆญ ๋งํฌ ์ฐจ์ด์
[OS] ํ๋ ๋งํฌ, ์ฌ๋ณผ๋ฆญ ๋งํฌ ์ฐจ์ด์
2025.10.19 -
[JS] ๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ ๊ณ์ฐํ๊ธฐ
[JS] ๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ ๊ณ์ฐํ๊ธฐ
2025.07.20 -
[CS] ๋ฒ ์ง์ ๊ณก์ ์๋ฆฌ ์ดํดํ๊ธฐ feat. ์นด์คํ ์กฐ ์๊ณ ๋ฆฌ์ฆ
[CS] ๋ฒ ์ง์ ๊ณก์ ์๋ฆฌ ์ดํดํ๊ธฐ feat. ์นด์คํ ์กฐ ์๊ณ ๋ฆฌ์ฆ
2025.06.23 -
[JS] async ํจ์๊ฐ await๋ฅผ ๋ง๋ฌ์ ๋ ๋์ ํ๋ฆ
[JS] async ํจ์๊ฐ await๋ฅผ ๋ง๋ฌ์ ๋ ๋์ ํ๋ฆ
2025.06.14