๐ *[ฤeลกtina](README-cs.md) โ [English](README.md) โ [Espaรฑol](README-es.md) โ [Italiano](README-it.md) โ [ๆฅๆฌ่ช](README-ja.md) โ [ํ๊ตญ์ด](README-ko.md) โ [Portuguรชs](README-pt.md) โ [ะ ัััะบะธะน](README-ru.md) โ [Slovenลกฤina](README-sl.md) โ [ะฃะบัะฐัะฝััะบะฐ](README-uk.md) โ [ไธญๆ](README-zh.md)* # The Art of Command Line [![Join the chat at https://gitter.im/jlevy/the-art-of-command-line](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jlevy/the-art-of-command-line?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - [Meta](#meta) - [Basics](#basics) - [Everyday use](#everyday-use) - [Processing files and data](#processing-files-and-data) - [System debugging](#system-debugging) - [One-liners](#one-liners) - [Obscure but useful](#obscure-but-useful) - [OS X only](#os-x-only) - [More resources](#more-resources) - [Disclaimer](#disclaimer) ![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](cowsay.png) ์ปค๋งจ๋๋ผ์ธ์ ๋ฅ์ํ๊ฒ ๋ค๋ฃจ๋๊ฒ์ ๋์ธ์๋๊ฑฐ๋ ์ ๋น์ค๋ฝ๊ฒ ์ฌ๊ฒจ์ง๋๋ค. ํ์ง๋ง ์ปค๋งจ๋๋ผ์ธ์ ๋ช ๋ฐฑํ๊ณ ๋ ๋ฏธ๋ฌํ ๋ฐฉ๋ฒ์ผ๋ก ์์ง๋์ด๊ฐ ํ๋ ์์ ์ ์ ์ฐ์ฑ๊ณผ ์์ฐ์ฑ์ ํฅ์์ํต๋๋ค. ์ด ๋ฌธ์๋ ๋ฆฌ๋ ์ค์์ ์์ ์ ํ๋ฉด์ ์ฐพ์ ๋ ธํธ์ ํ๋ค์ ๋ชจ์์ ๋๋ค. ๋ช ๊ฐ์ง๋ ๊ธฐ์ด์ ์ด๊ณ , ๋ช๊ฐ์ง๋ ์๋นํ ๊ตฌ์ฒด์ ์ด๋ฉฐ, ์ธ๋ จ๋๊ณ , ์ ์๋ ค์ง์ง ์์ ๊ฒ์ ๋๋ค. ์ด ๋ฌธ์๋ ๊ทธ๋ฆฌ ๊ธธ์ง ์์ง๋ง, ์ฌ๊ธฐ ์๋ ๋ชจ๋ ๊ฒ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๊ณ , ๊ธฐ์ตํด๋ผ ์ ์๊ฒ ๋๋ค๋ฉด, ๋ง์ ๊ฒ์ ์๊ฒ๋๋ ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ์๋ ๋๋ถ๋ถ์ ๊ฒ์ [์๋](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands) [Quora์](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix) [์ฌ๋ผ์จ](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know) ๊ฒ์ ๋๋ค. ํ์ง๋ง ๊ฑฐ๊ธฐ์ ๊ด์ฌ์ ๊ฐ์ง๊ธฐ๋ณด๋ค, Github๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ๋ ๊ฐ์น์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ฌ๊ธฐ์ ๋ ์ฌ๋ฅ์๋ ์ฌ๋๋ค์ด ์์ฝ๊ฒ ๊ฐ์ ์์ ์ ์ํ ์ ์๋ ๊ณณ์ด์ฃ . ๋ง์ฝ ๋ฌธ์ ๊ฐ ์๊ฑฐ๋, ๋ ๋์์ง ์ ์๋ ๋ด์ฉ์ด ๋ณด์ธ๋ค๋ฉด, ์ด์๋ฅผ ์ ์ถํ๊ฑฐ๋ ํ ๋ฆฌํ์คํธ๋ฅผ ๋ณด๋ด์ฃผ์ธ์! (๋ฌผ๋ก meta ์น์ ๊ณผ ์ด๋ฏธ ์กด์ฌํ๋ ํ ๋ฆฌํ์คํธ์ ์ด์๋ฅผ ๋ด์ฃผ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.) ## Meta ๋ฒ์: - ์ด ๊ฐ์ด๋๋ ์ด๋ณด์์ ๊ฒฝํ์ ๋ชจ๋๋ฅผ ์ํ ๊ฒ์ ๋๋ค. ๋ชฉํ๋ ๋ฒ์(์ ๋ถ ๋ค ์ค์ํฉ๋๋ค!), ๊ตฌ์ฒด์ฑ(๋๋ถ๋ถ์ ์ผ๋ฐ์ ์ธ ์ผ์ด์ค์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์์ ), ๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฒฐํจ(์ฝ๊ฒ ๋ง์ฃผ์น์ง ์๋, ์ค์ํ์ง ์๊ณ , ์ง์ฝ์ ์ธ ๊ฒ์ ํผํจ) ์ ๋๋ค. ๋ชจ๋ ํ์ ํน์ ์ํฉ์์ ๋งค์ฐ ์ค์ํ๊ฑฐ๋, ์ฌ๋ฌ ๋์๋ค ์ฌ์ด์์์ ์๊ฐ์ ํ์ฐํ๊ฒ ์ ์ฝํฉ๋๋ค. - ์ด ๋ฌธ์๋ ๋ฆฌ๋ ์ค๋ฅผ ์ํ๊ฒ์ ๋๋ค. "[OS X only](#os-x-only)"์ธ์ ์ ์ ์ธํ๊ณ ๋ง์ด์ฃ . ์ผ๋ถ๋ MacOS์์ ๋๊ฐ์ด ์ ์ฉ๋์ง ์์ต๋๋ค(Cygwin์์ ์กฐ์ฐจ ๋ง์ด์ฃ ). - ์ธํฐ๋ํฐ๋ธ Bash์ ์ด์ ์ด ๋ง์ถ์ด์ ธ์์ต๋๋ค๋ง, ๋๋ถ๋ถ์ ํ์ ๋ค๋ฅธ ์์ด๋, general Bash ์คํฌ๋ฆฝํธ์์๋ ๋์ํฉ๋๋ค. - ์ด ๋ฌธ์๋ "์คํ ๋ค๋" ์ ๋์ค ์ปค๋งจ๋์ ํน์ ํจํค์ง ์ค์น๋ฅผ ํ์๋ก ํ๋ ๊ฒ ๋ ๋ค ํฌํจํ๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ค๋ฃจ๋ ์คํ ๋ค๋ ์ปค๋งจ๋์ ํน์ ํจํค์ง์ ๋ํ ๊ฒ์ ํฌํจ๋ ๋งํผ ์ถฉ๋ถํ ์ค์ํฉ๋๋ค. ๋ ธํธ: - ์ด ๋ฌธ์๋ฅผ ํ ํ์ผ๋ก ์ ์งํ๊ธฐ ์ํด์, ์ปจํ ์ธ ๋ค์ ์์์ ์ธ ๋ ํผ๋ฐ์ค ํํ๋ก ํฌํจ๋์ด์์ต๋๋ค. ํ ๊ฐ๋ ์ด๋ ๋ช ๋ น์ด์ ๋ํด ์๊ฒ ๋ ํ์, ๋ค๋ฅธ๊ณณ์์ ๊ทธ์๋ํ ์ข ๋ ์์ธํ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์์๋งํผ ๋น์ ์ ๋๋ํ ๊ฒ์ ๋๋ค. `apt-get`, `yum`, `dnf`, `pacman`, `pip`, `brew` (ํน์ ์ ์ ํ ๋ค๋ฅธ ๊ฒ)์ ์ด์ฉํด ์ ํ๋ก๊ทธ๋จ์ ์ค์นํ์ธ์. - [Explainshell](http://explainshell.com/)์ ์ด์ฉํด์ ๊ฐ๊ฐ์ ์ปค๋งจ๋, ์ต์ , ํ์ดํ๋ ๊ทธ ์ธ ๋ฑ๋ฑ์ด ์ด๋ค๊ฒ์ธ์ง ์์๋ณด์ญ์์ค. ## Basics - ๊ธฐ๋ณธ Bash๋ฅผ ๋ฐฐ์ฐ์ธ์. ๋งํ์๋ฉด, ์ต์ํ `man bash`๋ฅผ ์คํํ๊ณ , ์ ๋ถ๋ฅผ ํ์ด ๋ณด์ธ์. ๋งค๋ด์ผ์ ๋ด์ฉ์ ๋ฐ๋ผ๊ฐ๊ธฐ ์ฌ์ฐ๋ฉฐ ๊ทธ๋ฆฌ ๊ธธ์ง ์์ต๋๋ค. ๋ค๋ฅธ ์๋ค ๋ํ ์ข์ต๋๋ค๋ง, Bash๋ ๊ฐ๋ ฅํ๊ณ ์ธ์ ๋ ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค( *์ค์ง* zsh, fish, ๊ทธ ์ธ์ ์๋ง์ ๋น์ ์ ๋ ธํธ๋ถ์์ ์๋ํ๋ฉด์ ๋ฐฐ์ฐ๋ ๊ฒฝ์ฐ์๋, ๋ง์ ๊ฒฝ์ฐ ์ ํ์ด ์๊ธธ๊ฒ์ ๋๋ค. ์ด๋ฏธ ์กด์ฌํ๋ ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ฑ์ ์ผ์์ ๋ง์ด์ฃ ). - ํ ์คํธ ๊ธฐ๋ฐ ์๋ํฐ๋ฅผ ์ต์ํ ํ๋์ ๋ ๋ค๋ฃฐ ์ ์๊ฒ ๋ฐฐ์ฐ์ธ์. Vim(`Vi`)๊ฐ ์ด์์ ์ ๋๋ค. ํฐ๋ฏธ๋์์ ์จ๊ฐ ์์ ์ ํ๋๋ฐ ๋ค๋ฅธ ์ค์ง์ ์ธ ๊ฒฝ์์๊ฐ ์๊ธฐ ๋๋ฌธ์ด์ฃ (Emacs, ๋ํ IDE ๋๋ ๋ชจ๋ ํ์คํฐ์ค๋ฌ์ด ์๋ํฐ๋ฅผ ๋๋ถ๋ถ์ ์์ ์ ์ฌ์ฉํ๋ค๊ณ ํด๋ ๋ง์ด์ฃ ). - `man`์ ์ด์ฉํด์ ๋ฌธ์๋ฅผ ์ฝ๋ ๋ฒ์ ๋ฐฐ์ฐ์ธ์(ํธ๊ธฐ์ฌ ๋ง์ ์ฌ๋์ ์ํด์ ํ๋ ์๊ธฐ์ ๋๋ค๋ง, `man man`์ ์น์ ๋ฒํธ๋ค์ ๋ชฉ๋ก์ ํ์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด 1์ "regular" ์ปค๋งจ๋, 5๋ files/conventions, ๊ทธ๋ฆฌ๊ณ 8์ administration์ด์ฃ ). `apropos`๋ฅผ ํ์ฉํด์ man ํ์ด์ง๋ฅผ ์ฐพ์ผ์ธ์. ๋ช๋ช ์ปค๋งจ๋๋ ์คํ๊ฐ๋ฅํ ์ปค๋งจ๋๊ฐ ์๋๋ผ๋ ๊ฒ์ ์์๋์ธ์. ํ์ง๋ง Bash ๋นํธ์ธ ํจ์๋ค์ `help`์ `help -d`๋ฅผ ์ด์ฉํด์ ๋์๋ง์ ๋ณผ ์ ์์ต๋๋ค. - `>`์ `<`, `|`๋ฅผ ์ด์ฉํ ํ์ดํ๋ฅผ ์ฌ์ฉํด์ ์ ๋ ฅ๊ณผ ์ถ๋ ฅ์ ๋ฆฌ๋ค์ด๋ ์ ์ ๋ฐฐ์ฐ์ธ์. `>`๋ ์ถ๋ ฅ ํ์ผ์ ๋ฎ์ด ์์ฐ๊ณ , `>>`๋ ๋ง๋ถ์ด๋๊ฑธ ์์๋์ธ์. stdout(์ญ์ฃผ: ํ์ค ์ถ๋ ฅ)๊ณผ stderr(์ญ์ฃผ: ํ์ค ์๋ฌ ์ถ๋ ฅ)์ ๋ํด์ ๋ฐฐ์ฐ์ธ์. - `*`(๊ทธ๋ฆฌ๊ณ ์๋ง๋ `?`๊ณผ `{`...`}`)์ ์ด์ฉํ๋ ํ์ผ ๊ธ๋กญ(glob) ํ์ฅ์ ๋ฐฐ์ฐ์ธ์. ๊ทธ๋ฆฌ๊ณ ์๋ฐ์ดํ`"`์ ํ๋ฐ์ดํ`'`์ ์ฐจ์ด๋ฅผ ๋ฐฐ์ฐ์ธ์. (๋ณ์ ํ์ฅ์ ๋ํด์ ๋ ๋ณด๋ ค๋ฉด ์๋๋ฅผ ์ฐธ์กฐํ์ธ์) - Bash ์์ ๊ด๋ฆฌ์ ์ต์ํด์ง์ธ์. `&`, **ctrl-z**, **ctrl-c**, `jobs`, `fg`, `bg`, `kill` ๋ฑ๋ฑ. - `ssh`๋ฅผ ๋ฐฐ์ฐ๊ณ , `ssh-agent`, `ssh-add`๋ฅผ ํตํด์ ๋น๋ฐ๋ฒํธ ์๋ ์ธ์ฆ ๋ฐฉ์์ ๊ธฐ๋ณธ์ ๋ฐฐ์ฐ์ธ์. - ๊ธฐ๋ณธ ํ์ผ ๊ด๋ฆฌ: `ls`์ `ls -l`(ํน๋ณํ, `ls -l`์์ ๊ฐ๊ฐ์ ์ด์ด ๋ฌด์จ ์๋ฏธ์ธ์ง ๋ฐฐ์ฐ์ธ์), `less`, `head`, `tail` ๊ทธ๋ฆฌ๊ณ `tail -f`(๋๋ ๋ ์ข์ `less +F`), `ln`๊ณผ `ln -s`(ํ๋ ๋งํฌ์ ์ํํธ ๋งํฌ์ ์ฐจ์ด์ ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ ๋ฐฐ์ฐ์ธ์), `chown`, `chmod`, `du`( ๋์คํฌ ์ฌ์ฉ๋์ ๋น ๋ฅธ ์์ฝ์ ๋ณด๋ ค๋ฉด `du -hs *`). ํ์ผ ์์คํ ๊ด๋ฆฌ๋ฅผ ์ํด์๋ `df`, `mount`, `fdisk`, `mkfs`, `lsblk`. - ๊ธฐ๋ณธ ๋คํธ์ํฌ ๊ด๋ฆฌ: `ip` ๋๋ `ifconfig`, `dig`. - ์ ๊ทํํ์(regular expression)์ ์ ์์๋์ธ์. ๊ทธ๋ฆฌ๊ณ `grep`/`egrep`์ ๋ค์ํ ํ๋๊ทธ๋ ์์๋์ธ์. `-i`, `-o`, `-v`,`-A`, `-B`์ `-C` ์ต์ ์ ์์๋ ๊ฐ์น๊ฐ ์์ต๋๋ค. - `apt-get`, `yum`, `dnf` ๋๋ `pacman`์ ์ด์ฉํ์ฌ ํจํค์ง๋ฅผ ์ฐพ๊ณ ์ค์นํ๋ ๋ฒ์ ๋ฐฐ์ฐ์ธ์. ๊ทธ๋ฆฌ๊ณ `pip`๊ฐ ์ค์น๋์ด์๋์ง ํ์ธํด์, ํ์ด์ ๊ธฐ๋ฐ์ ์ปค๋งจ๋ ๋ผ์ธ ๋๊ตฌ๋ฅผ ์ค์นํ ์ ์๋๋ก ํ์ธ์(๋ฐ์ ์ค๋ช ๋ ๊ฒ์ค ๋ช๊ฐ์ง๋ `pip`๋ฅผ ์ด์ฉํด ์ค์นํ๋๊ฒ ์ ์ผ ์ฝ์ต๋๋ค. ## Everyday use - Bash ์์ **Tab**์ ์ฐ๋ฉด argument๋ฅผ ์์ฑํ๊ณ , **ctrl-r**์ ์ฐ๋ฉด ์ปค๋งจ๋ ํ์คํ ๋ฆฌ์์ ๊ฒ์ํฉ๋๋ค. - Bash์์ **ctrl-w**๋ ๋ง์ง๋ง ๋จ์ด๋ฅผ ์ง์๋๋ค. **ctrl-u**๋ ๋ผ์ธ์ ์ฒ์๊น์ง ์ ๋ถ๋ค ์ง์๋๋ค. **alt-b**์ **alt-f**๋ฅผ ์ด์ฉํด์ ๋จ์ด ๋จ์๋ก ์ด๋ํ ์ ์์ต๋๋ค. **ctrl-a**๋ก ๋ผ์ธ์ ์์์ ์ผ๋ก ์ด๋ํ ์ ์๊ณ **ctrl-e**๋ก ๋ผ์ธ์ ๋์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค. **ctrl-k**๋ ์ปค์ ์์น๋ถํฐ ๋ผ์ธ์ ๋๊น์ง ์ง์๋๋ค. **ctrl-l**์ ํ๋ฉด์ ๊นจ๋ํ๊ฒ ํฉ๋๋ค. `man readline`์ ์ด์ฉํด์ Bash์ ๊ธฐ๋ณธ ํค ์กฐํฉ์ ์ดํด๋ณด์ธ์. ๋ง์ ๊ฒ์ด ์์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด **alt-.**๊ฐ์ ๊ฒฝ์ฐ, ์ด๊ฑด argument๋ฅผ ๋์๊ฐ๋ฉด์ ๋ํ๋ด๊ณ **alt-***๋ ๊ธ๋กญ์ ํ์ฅํฉ๋๋ค. - vi ์คํ์ผ์ ํค ์กฐํฉ์ ์ฌ๋ํ๋ค๋ฉด, `set -o vi`๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. - ์ต๊ทผ ์ฌ์ฉํ ์ปค๋งจ๋๋ฅผ ๋ณด๋ ค๋ฉด `history`๋ฅผ ์ ๋ ฅํ์ธ์. `!$`(๋ง์ง๋ง argument), `!!`(๋ง์ง๋ง ์ปค๋งจ๋)์ ๊ฐ์ ์ฝ์ด๋ค์ด ๋งค์ฐ ๋ง์ต๋๋ค. ๋น๋ก ์ด๋ฐ ๊ฒ๋ค์ด **ctrl-r**์ด๋ **alt-.**๋ช ๋ น์ด๋ก ์์ฃผ ๋์ฒด๋๊ธฐ ์ฝ์ง๋ง์. - ์ด์ ์ ์์ ํ๋ ๋๋ ํ ๋ฆฌ๋ก ๋์๊ฐ๋ ค๋ฉด `cd -`๋ฅผ ์ฌ์ฉํ์ธ์. - ์ปค๋งจ๋๋ฅผ ํ์ดํ ํ๋ ๋์ค์ ๋ง์์ด ๋ฐ๋์๋ค๋ฉด, **alt-#**์ ์ณ์ ์์์ ์ `#`์ ์ฝ์ ํ๊ณ , ์ํฐ๋ฅผ ์ณ์ ์ฝ๋ฉํธ๋ก ์ฌ๊ฒจ์ง๊ฒ ํ์ธ์(๋๋ **ctrl-a**, **#**, **enter**). ๋์ค์ ์ปค๋งจ๋ ํ์คํ ๋ฆฌ์์ ์ฐพ์์ ํ์ดํ ์ค์ด์๋ ์ปค๋งจ๋๋ก ๋์์ฌ ์ ์์ต๋๋ค. - `xargs`(ํน์ `parallel`)๋ฅผ ์ฌ์ฉํ์ธ์. ๋งค์ฐ ๊ฐ๋ ฅํฉ๋๋ค. ๋ผ์ธ๋น ๋ช๊ฐ์ ์์ดํ ์ด ์คํ๋๊ฒ ํ ๊ฒ์ธ์ง(`-L`) ๊ทธ๊ฑธ ๋ณ๋ ฌ๋ก ํ ๊ฒ์ธ์ง(`-P`)๋ฅผ ์ ์ดํ ์ ์๋ค๋๊ฑธ ๊ธฐ์ตํ์ธ์. ์ ๋๋ก ํ๊ณ ์๋์ง ํ์ ํ ์ ์๋ค๋ฉด `xargs echo`๋ฅผ ๋จผ์ ์คํํด๋ณด์ธ์. ๋ `-I{}`๋ ๊ฐํธํฉ๋๋ค. ์์: ```bash find . -name '*.py' | xargs grep some_function cat hosts | xargs -I{} ssh root@{} hostname ``` - `pstree -p`๋ ํ๋ก์ธ์ค ํธ๋ฆฌ๋ฅผ ํ์ํ๋๋ฐ ๋์์ด ๋ฉ๋๋ค. - `pgrep`๊ณผ `pkill`์ ์ฌ์ฉํด์ ํ๋ก์ธ์ค๋ฅผ ์ฐพ๊ฑฐ๋ ์๊ทธ๋์ ๋ณด๋ด์ธ์(`-f`๊ฐ ์ ์ฉํฉ๋๋ค). - ํ๋ก์ธ์ค์ ๋ณด๋ผ ์ ์๋ ๋ค์ํ ์๊ทธ๋์ ์์๋์ธ์. ์๋ฅผ ๋ค์ด, ํ๋ก์ธ์ค๋ฅผ ์ผ์์ค์ง ํ ๋๋ `kill -STOP [pid]`๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ ์ฒด ๋ชฉ๋ก์ `man 7 signal`์์ ๋ณผ ์ ์์ต๋๋ค. - ๋ฐฑ๊ทธ๋ผ์ด๋ ํ๋ก์ธ์ค๋ฅผ ์์ํ ๋์๊ฐ๊ฒ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด, `nohup`์ด๋ `disown`์ ์ฌ์ฉํ์ธ์. - ์ด๋ค ํ๋ก์ธ์ค๊ฐ ๋ฆฌ์ค๋(์ญ์ฃผ: ํน์ ํฌํธ๋ก ๋ค์ด์ค๋ ํจํท ๋ฆฌ์ค๋)์ ํ๊ณ ์๋์ง ์๋ ค๋ฉด `netstat -lntp`๋ `ss -plat`์ ์ฌ์ฉํด์ ์ ์ ์์ต๋๋ค(TCP์ผ ๊ฒฝ์ฐ์ ๋๋ค. UDP์ ๊ฒฝ์ฐ `-u`์ต์ ์ ์ถ๊ฐํ์ธ์). - `lsof`๋ฅผ ์ด์ฉํด์ ์ด๋ ค์๋ ์์ผ๊ณผ ํ์ผ์ ๋ณผ ์ ์์ต๋๋ค. - Bash ์คํฌ๋ฆฝํธ์์ `set -x`๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ฒ๊น ์ฉ ์ถ๋ ฅ์ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค. ์คํธ๋ฆญํธ ๋ชจ๋(strict mode)๊ฐ ๊ฐ๋ฅํ ๋๋ฉด ์ฌ์ฉํ์ธ์. `set -e`๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฌ๊ฐ ๋ฌ์๋ ์ค๋จ์ํค๊ฒ๋ฉ๋๋ค. `set -o pipefail`์ ์ฌ์ฉํ๋ฉด ์๋ฌ์ ๋ํด์ ๊ฐ๊ฒฝํ ๊ธฐ์ค์ ์ ์ฉํฉ๋๋ค(์ด ์ฃผ์ ๊ฐ ์กฐ๊ธ ๋ฏธ๋ฌํ์ง๋ง ๋ง์ด์ฃ ). ๋ ๋ณต์กํ ์คํฌ๋ฆฝํธ์ ๊ฒฝ์ฐ `trap`๋ํ ์ฌ์ฉํฉ๋๋ค. - `uptime`์ด๋ `w`๋ฅผ ์ด์ฉํด์ ์์คํ ์ด ์ผ๋ง๋ ์ค๋ ์คํ์ค์ธ์ง ์ ์ ์์ต๋๋ค. - ์์ฃผ ์ฌ์ฉ๋๋ ์ปค๋งจ๋์ ๋ํด์ `alias`๋ฅผ ์ด์ฉํด์ ์์ปท์ ๋ง๋์ธ์. ์๋ฅผ๋ค์ด, `alias ll='las -latr'`์ ์ ๋จ์ถ๋ช ๋ น `ll`์ ๋ง๋ญ๋๋ค. - Bash ์คํฌ๋ฆฝํธ์์ (๊ดํธ๋ก ๋๋ฌ์์ฌ ์์ฑ๋) ์๋ธ์์ ์ปค๋งจ๋๋ฅผ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ๋๋ค. ์ผ๋ฐ์ ์ธ ์๋ก, ์์๋ก ๋ค๋ฅธ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ํ์ฌ ์์ ํ๋ ๊ฒ์ด ์์ต๋๋ค. ```bash # do something in current dir (cd /some/other/dir && other-command) # continue in original dir ``` - Bash ์๋ ์ฌ๋ฌ๊ฐ์ง ๋ค์ํ ๋ณ์ ํ์ฅ์ด ์๋ค๋ ๊ฒ์ ์์๋์ธ์. ๋ณ์๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ ค๋ฉด `${name:?error message}`๋ฅผ ์ฌ์ฉํ์ธ์. ์๋ฅผ ๋ค์ด Bash ์คํฌ๋ฆฝํธ๊ฐ ํ๋์ argument๋ฅผ ์๊ตฌํ๋ค๋ฉด, `input_file=${1:?usage: $0 input_file}`๋ฅผ ์ฌ์ฉํ์ธ์. ์ฐ์ ํ์ฅ์ `i=$(( (i + 1) % 5 ))` ์ฒ๋ผ ์ฌ์ฉํฉ๋๋ค. ์์ด์ `{1...10}`์ฒ๋ผ ์ฌ์ฉํฉ๋๋ค. ๋ฌธ์์ด ํธ๋ฆฌ๋ฐ(trimmin)์ `${var%suffix}`์ด๋ `${var#prefix}`์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ๋ค์ด `var=foo.pdf`๋ผ๋ฉด, `echo ${var$.pdf}.txt`๋ `foo.txt`๋ฅผ ์ถ๋ ฅํฉ๋๋ค. - ์ปค๋งจ๋์ ์คํ ๊ฒฐ๊ณผ ์ถ๋ ฅ๋ฌผ์ `<(some command)`์ฒ๋ผ ์ด์ฉํด์ ํ์ผ์ฒ๋ผ ๋ค๋ค์ง ์ ์์ต๋๋ค. ์๋ฅผ๋ค์ด ๋ก์ปฌ์ `/etc/hosts`๋ฅผ ๋ฆฌ๋ชจํธ์ ๊ฒ๊ณผ ๋น๊ตํ๋ ค๋ฉด ๋ค์์ฒ๋ผ ํ๋ฉด ๋ฉ๋๋ค. ```sh diff /etc/hosts <(ssh somehost cat /etc/hosts) ``` - `cat << EOF...`๊ฐ์ "here documents"์ ๋ํด์ ์์๋์ธ์. - Bash์์ ํ์ค ์ถ๋ ฅ(standard output)๊ณผ ํ์ค ์๋ฌ(standard error) ๋ ๋ค `some-command > logfile 2>&1`๊ฐ์ ๋ช ๋ น์ด๋ก ๋ฆฌ๋ค์ด๋ ํธํ ์ ์์ต๋๋ค. ์ข ์ข , ์ปค๋งจ๋๊ฐ ์ด๋ฆฐ ํ์ผ ํธ๋ค์ ๋จ๊ธฐ์ง ์๋ ๊ฒ์ ํ์คํ ํ๊ธฐ ์ํด, ํ์ฌ ์์ ์ค์ธ ํฐ๋ฏธ๋์์ ๋ช ๋ น์ด์ `</dev/null`์ ๋ง๋ถ์ด๋ ๊ฒ์ ์ข์ ์ต๊ด์ ๋๋ค. - `man ascii`๋ฅผ ์ฌ์ฉํด์ ํฅ์ค๊ฐ๊ณผ 10์ง ๊ฐ์ด ๊ฐ์ด ์๋ ํ๋ฅญํ ASCII ํ ์ด๋ธ์ ๋ณผ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์ธ์ฝ๋ฉ ์ ๋ณด๋ฅผ ๋ณด๋ ค๋ฉด `man unicode`, `man utf-8` ๊ทธ๋ฆฌ๊ณ `man latin1`์ ์ด์ฉํ ์ ์์ต๋๋ค. - `screen`์ ์ด์ฉํ๊ฑฐ๋ [`tmux`](https://tmux.github.io/)๋ฅผ ์ด์ฉํด์ ํ๋ฉด์ ๋ค์ค๋ถํ ํ ์ ์์ต๋๋ค. ํนํ ๋ฆฌ๋ชจํธ ssh ์ธ์ ์ ๋ผ์ด๋ด๊ณ (detach) ๋ค์ ๋ถ์ด๋๋ฐ(re-attach)ํ๋๋ฐ ์ ์ฉํฉ๋๋ค. ์ธ์ ์ ์๊ตฌํ ์ ์งํ๋ ์ต์ํ์ ๋์์ ์ค์ง `dtach`๋ฐ์ ์์ต๋๋ค. - ssh์์ `-L`์ด๋ `-D`(๊ฐ๋ `-R`)๋ฅผ ์ด์ฉํด์ ํฌํธ ํฐ๋๋งํ๋ ๊ฒ์ ์์๋์๋ฉด ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฆฌ๋ชจํธ ์๋ฒ๋ฅผ ๊ฒฝ์ ํด์ ์น์ฌ์ดํธ์ ์ ์ํ๋ค๊ฑฐ๋ ํ ๋ ๋ง์ด์ฃ . - ๋ช๊ฐ์ง ssh ์ค์ ์ ์ต์ ํํ๋ ๊ฒ์ ์ ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ๋ค์ด `~/.ssh/config`๋ ํน์ ๋คํธ์ํฌ ํ๊ฒฝ์์ ์ฐ๊ฒฐ์ด ๋๊ธฐ๋ ๊ฒ์ ํํผํ๊ธฐ ์ํด ์์ถ์ ์ฌ์ฉํ๋ ์ค์ ๋ค์ ๋ด๊ณ ์์ต๋๋ค(ํนํ scp ๋ช ๋ น์ด๋ฅผ ๋ฎ์ ๋์ญํญ ์ฐ๊ฒฐ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ๋์์ด ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ก์ปฌ ์ ์ด ํ์ผ์์ ๊ฐ์ ์๋ฒ๋ก ์ฐ๊ฒฐํ๋ ์ฑ๋์ ๋ค์คํํ ์ ์์ต๋๋ค. ``` TCPKeepAlive=yes ServerAliveInterval=15 ServerAliveCountMax=6 Compression=yes ControlMaster auto ControlPath /tmp/%r@%h:%p ControlPersist yes ``` - ssh์ ๋ช ๊ฐ์ง ์ต์ ๋ค์ ๋ณด์์ ๋ฏผ๊ฐํ ์ต์ ์ด๋ฉฐ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์ฌ์ฉ๋์ด์ผํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์๋ธ๋ท, ํธ์คํธ ๋๋ ์ ๋ขฐ๋๋ ๋คํธ์ํฌ์์ `StrictHostKeyChecking=no`, `ForwardAgent=yes`์ ์ฌ์ฉํ๋ ๊ฒ ๋ฑ์ ๋๋ค. - ์์คํ ์ค์ ์ ์ ์ฉํ์ง๋ง `ls`๋ก ์ป์ ์ ์๊ณ ์ฝ๊ฒ ์๋ง์ด ๋๊ธฐ ์ฌ์ด ํ์ผ์ ๊ถํ์ 8์ง๋ฒ ํํ๋ก ์ป์ผ๋ ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ์ปค๋งจ๋๋ฅผ ์ฌ์ฉํ์ธ์. ```sh stat -c '%A %a %n' /etc/timezone ``` - ๋ค๋ฅธ ์ปค๋งจ๋์ ์ถ๋ ฅ๊ณผ ์ํธ์์ฉํ๋ฉด์ ๊ฐ์ ์ ํํ๋ ค๋ฉด [`percol`](https://github.com/mooz/percol)์ด๋ [`fzf`](https://github.com/junegunn/fzf)๋ฅผ ์ฌ์ฉํ์ธ์. - ๋ค๋ฅธ ์ปค๋งจ๋(์๋ฅผ ๋ค๋ฉด `git`)์ ์ถ๋ ฅ์ ๊ธฐ๋ฐํ๋ ํ์ผ๊ณผ ์ํธ์์ฉํ๋ ค๋ฉด, `fpp` ([PathPicker](https://github.com/facebook/PathPicker))๋ฅผ ์ฌ์ฉํ์ธ์. - ํ์ฌ ๋คํธ์ํฌ์ ์๋ ์ฌ์ฉ์๋ค์๊ฒ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ์๋ ๋ชจ๋ ํ์ผ(๊ณผ ํ์ ๋๋ ํ ๋ฆฌ)๋ฅผ ์ํ ๋จ์ํ ์น์๋ฒ๋ฅผ ์ํ๋ค๋ฉด ๋ค์์ ์ฌ์ฉํ์ธ์: `python -m SimpleHTTPServer 7777` (7777ํฌํธ, Python 2) ๊ทธ๋ฆฌ๊ณ `python -m http.server 7777` (7777ํฌํธ, Python 3). - ๊ถํ์ ๊ฐ์ง๊ณ ์ปค๋งจ๋๋ฅผ ์คํํ๋ ค๋ฉด, `sudo` (root ์ ์ ๊ถํ)๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, `sudo -u`(๋ค๋ฅธ ์ ์ ๊ถํ)์ ์ฌ์ฉํ์ธ์. `su`๋ `sudo bash`๋ ์์ ํด๋น ์ ์ ์ธ ๊ฒ์ฒ๋ผ ์คํ์ํต๋๋ค. `su -`๋ ์ ๋ก๊ทธ์ธ์ root์ด ๋ค๋ฅธ ์ ์ ์ธ๊ฒ์ฒ๋ผ ์๋ฎฌ๋ ์ดํธ ํฉ๋๋ค. ## Processing files and data - ํ์ฌ ๋๋ ํ ๋ฆฌ์์ ํ์ผ์ ์ด๋ฆ์ผ๋ก ์ฐพ์ผ๋ ค๋ฉด `find . -iname '*something*'` (๋๋ ๋น์ทํ๊ฒ)๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ์ด๋๊ณณ์ ์๋ ํ์ผ์ ์ด๋ฆ์ผ๋ก ์ฐพ์ผ๋ ค๋ฉด `locate something`์ ์ฌ์ฉํ์ธ์(ํ์ง๋ง ์ธ๋ด๋ฅผ ๊ฐ์ ธ์ผํฉ๋๋ค. `updatedb`๊ฐ ์ต๊ทผ์ ์์ฑ๋ ํ์ผ์ ์ธ๋ฑ์ฑํ์ง ์์์ ์ ์์ต๋๋ค). - ์์ค๋ ๋ฐ์ดํฐ ํ์ผ๋ค์์ ์ผ๋ฐ์ ์ธ ๊ฒ์์ ํ ๋๋(`grep -r`๋ณด๋ค ๋ ๋ณต์กํ ๋), [`ag`](https://github.com/ggreer/the_silver_searcher)๋ฅผ ์ฌ์ฉํ์ธ์. - HTML์ ํ ์คํธ๋ก ๋ณํํ ๋๋ `lynx -dump -stdin`๋ฅผ ์ฌ์ฉํ์ธ์. - ๋งํฌ๋ค์ด, HTML, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์ข ๋ฅ์ ๋ฌธ์ ๋ณํ์๋ [`pandoc`](http://pandoc.org/)์ ์๋ํด๋ณด์ธ์. - XML์ ๋ฐ๋์ ๋ค๋ค์ผํ๋ค๋ฉด, `xmlstarlet`์ ์ฌ์ฉํ์ธ์. ์ค๋๋์์ง๋ง ์ข์ต๋๋ค. - JSON์๋ [`jq`](http://stedolan.github.io/jq/)๋ฅผ ์ฌ์ฉํ์ธ์. - Excel์ด๋ CSVํ์ผ์๋ [csvkit](https://github.com/onyxfish/csvkit)๊ฐ `in2csv`, `csvcut`, `csvjoin`, `csvgrep`์ธ ๋ค๋ฅธ ๋๊ตฌ๋ค์ ์ ๊ณตํฉ๋๋ค.. - Amazon S3๋ฅผ ๋ค๋ฃฐ๋๋ [`s3cmd`](https://github.com/s3tools/s3cmd)๊ฐ ํธ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ [`s4cmd`](https://github.com/bloomreach/s4cmd)๋ ๋น ๋ฆ ๋๋ค. Amazon์ [`aws`](https://github.com/aws/aws-cli)๋ ๋ค๋ฅธ AWS ๊ด๋ จ ์์ ์ ํต์ฌ์ ์ธ ๋๊ตฌ์ ๋๋ค. - `sort`์ `uniq`์ ๋ํด์ ์์๋์ธ์. uniq์ `-u`, `-d`์ต์ ์ ํฌํจํด์ ๋ง์ด์ฃ . ํ๋จ์ one-liner๋ฅผ ๋ณด์ธ์. ๊ทธ๋ฆฌ๊ณ `comm`๋ ๋ณด์ธ์. - ํ ์คํธ ํ์ผ๋ค์ ๋ค๋ฃจ๋ `cut`, `paste` ๊ทธ๋ฆฌ๊ณ `join`์ ๋ํด์ ์์๋์ธ์. ๋ง์ ์ฌ๋๋ค์ด `cut`์ ์ฌ์ฉํ์ง๋ง `join`์ ๋ํด์๋ ์๊ณ ์์ต๋๋ค. - `wc`๋ฅผ ์ด์ฉํด์ ํ(`-l`), ์บ๋ฆญํฐ(`-m`), ๋จ์ด(`-w`) ๊ทธ๋ฆฌ๊ณ ๋ฐ์ดํธ(`-c`)๋ฅผ ์ธ๋ ๊ฒ์ ์์๋์ธ์. - `tee`๋ฅผ ์ด์ฉํด์ `ls -al | tee file.txt`์ฒ๋ผ, ํ์ค์ ๋ ฅ(stdin)์์ ๋ณต์ฌํด์ ํ์ผ๋ก ๋ณด๋ด๊ฑฐ๋, ํ์ค ์ถ๋ ฅ(stdout)์ผ๋ก ๋ณด๋ด๋ ๊ฒ์ ์์๋์ธ์. - ๋ก์ผ์ผ์ด ์ปค๋งจ๋๋ผ์ธ ๋๊ตฌ์ ์ ๋ ฌ ์์(collation)์ ํผํฌ๋จผ์ค๋ฅผ ํฌํจํด์ ๋ฏธ๋ฌํ๊ฒ ์ํฅ์ ๋ผ์น๋ ๊ฒ์ ์์๋์ธ์. ๋๋ถ๋ถ์ ๋ฆฌ๋ ์ค ์ค์น๋ `LANG`์ด๋ ๋ค๋ฅธ ๋ก์ผ์ผ ๋ณ์๋ฅผ US English์ ๊ฐ์ ๋ก์ปฌ ์ธํ ์ผ๋ก ์ค์ ํฉ๋๋ค. ํ์ง๋ง ๋ก์ผ์ผ์ ๋ฐ๊ฟ ๊ฒฝ์ฐ ์ ๋ ฌ๋ ๋ฐ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์ฃผ์ํ์ธ์. ๊ทธ๋ฆฌ๊ณ i18n ๋ฃจํด๋ค๋ ์ ๋ ฌ์ด๋ ๋ค๋ฅธ ์ปค๋งจ๋๋ค์ *๋ช ๋ฐฐ* ๋๋ฆฌ๊ฒ ํ ์ ์์ต๋๋ค. `export LC_ALL=C`๋ฅผ ์ฌ์ฉํ์ฌ, ์ด๋ค ์ํฉ์์๋( ๋ฐ์ ์๋ ์งํฉ(set) ์์ ์ด๋, ์ ์ผ์ฑ ์์ ๋ฑ) i18n์ ๋๋ฆฐ ๋ฃจํด๋ค์ ํต์ฑ๋ก ์์ ํ๊ฒ ๋ฌด์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ํต์ ์ธ ๋ฐ์ดํธ ๊ธฐ๋ฐ์ ์ ๋ ฌ ์์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. - ๊ฐ๋จํ ๋ฐ์ดํฐ ์กฐ์์ ํ ๋ `awk`์ `sed`๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ์์๋์ธ์. ์๋ฅผ ๋ค์ด ํ ์คํธ ํ์ผ์ ์ธ๋ฒ์งธ ์ด์ ์ซ์๋ค์ ๋ชจ๋ ๊ฐ์ ๋ํ๋ ๊ฒ์ ์ด๋ ๊ฒ ํฉ๋๋ค: `awk '{ x += $3 } END { print x }'`. ์ด ๋ฐฉ๋ฒ์ ๊ฐ์ ์ผ์ ํ๋ ํ์ด์ฌ ์ฝ๋๋ณด๋ค 3๋ฐฐ์ ๋ ๋น ๋ฅด๊ณ , 1/3์ ๋์ ๊ธธ์ด๋ฐ์ ์๋ฉ๋๋ค. - ํ๋ ์ด์์ ํ์ผ์์ ์ถ๊ฐ์ ์ธ ํ์ผ์ ์์ฑํ์ง ์๊ณ ๋ฌธ์์ด ๋ฐ๊พธ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ธ์. ```sh perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt ``` - ํ๋ฒ์ ๋ง์ ํ์ผ์ ํจํด์ ๋ฐ๋ผ์ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ๋ฅผ ํ๋ ค๋ฉด, `rename`์ ์ฌ์ฉํ์ธ์. ๋ณด๋ค ๋ณต์กํ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ๋, [`repren`](https://github.com/jlevy/repren)์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค. ```sh # Recover backup files foo.bak -> foo: rename 's/\.bak$//' *.bak # Full rename of filenames, directories, and contents foo -> bar: repren --full --preserve-case --from foo --to bar . ``` `shuf`๋ฅผ ์ฌ์ฉํด์ ํ์ผ์์ ์์์ ํ์ ์ ํํ๊ฑฐ๋, ์์ ์ ์์ต๋๋ค. - `sort`์ ์ต์ ๋ค์ ์์๋์ธ์. `-n`์ ์ซ์๋ฅผ ์ ๋ ฌํ ๋, `-h`๋ ์ฌ๋์ด ์ฝ์ ์ ์๊ฒ ์์ฑํ ์ซ์์ ๊ฒฝ์ฐ(`du -h`์ ๊ฐ์ ํํ). ํค๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์์๋์ธ์(`-t`์ `-k`). ํน๋ณํ, ์ฒซ๋ฒ์งธ ํ๋๋ก๋ง ์ ๋ ฌํด์ผ ํ๋ค๋ฉด `-k1,1`์ ์ ์ด์ผ ํ๋ค๋๊ฑธ ์ฃผ์ํ์ธ์. `-k1`์ ๋ชจ๋ ํ์ ๋ํด์ ์ ๋ ฌํ๋ผ๋ ๋ป์ ๋๋ค. ์์ ์ ์ธ ์ ๋ ฌ(`sort -s`)๋ ์ ์ฉํฉ๋๋ค. ์๋ฅผ๋ค์ด, ๋จผ์ 2๋ฒ ํ๋๋ก ์ ๋ ฌํ๊ณ , ๊ทธ ๋ค์์ 1๋ฒ ํ๋๋ก ์ ๋ ฌํ ๊ฒฝ์ฐ, `sort -k1,1 | sort -s -k2,2`์ฒ๋ผ ํ ์ ์์ต๋๋ค. - ๋ง์ฝ ํญ(tab)๋ฌธ์๋ฅผ Bash ์ปค๋งจ๋ ๋ผ์ธ์ ์ฌ์ฉํด์ผ ํ ํ์๊ฐ ์๊ธธ ๊ฒฝ์ฐ(์๋ฅผ ๋ค๋ฉด -t argument๋ฅผ ์ด์ฉํด ์ ๋ ฌ ํ ๋), **ctrl-v** **[Tab]**ํค๋ฅผ ๋๋ฅด๊ฑฐ๋, `$'\t'`๋ฅผ ์ฐ์ธ์(๋ฌธ์์ชฝ์ด ๋ณต์ฌ๋ ๋ถ์ฌ๋ฃ๊ธฐ๋ฅผ ํ ์ ์์ด ๋ ๋ซ์ต๋๋ค.). - ์์ค์ฝ๋๋ฅผ ํจ์นํ๋ ๊ธฐ๋ณธ ๋๊ตฌ๋ `diff`์ `patch`์ ๋๋ค. diff์ ํต๊ณ ์์ฝ์ ๋ณด๋ ค๋ฉด `diffstat`๋ฅผ ๋ณด์ธ์. `diff -r`์ ๋ชจ๋ ๋๋ ํ ๋ฆฌ์ ๋ํด ์์ ์ ์ํํ๋๊ฑธ ์์๋์ธ์. `diff -r tree1 tree2 | diffstat`์ผ๋ก ๋ณ๊ฒฝ ๋ด์ญ์ ์์ฝ์ ๋ณผ ์ ์์ต๋๋ค. - ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๊ฐ๋จํ๊ฒ hex ๋คํ๋ฅผ ๋จ๊ณ ์ถ์ ๋๋ `hd`๋ฅผ ์ฐ์ธ์. ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ์์ ํ ๋๋ `bvi`๋ฅผ ์ฌ์ฉํ์ธ์. - `strings` (๊ทธ๋ฆฌ๊ณ `grep`, ๋ฑ) ์ ์ฌ์ฉํด์ ๋ฐ์ด๋๋ฆฌ ํ์ผ ์์์ ๋ฌธ์์ด ๋นํธ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. - ๋ฐ์ด๋๋ฆฌ ํ์ผ์ diffํ๋ ค๋ฉด(๋ธํ ์์ถ), `xdelta3`๋ฅผ ์ฌ์ฉํ์ธ์. - ํ ์คํธ ํ์ผ ์ธ์ฝ๋ฉ์ ๋ณ๊ฒฝํ๋ ค๋ฉด `iconv`๋ฅผ ์๋ํด๋ณด์ธ์. ๋๋ `uconv`๋ ๋ ๋ณต์กํ ๋ชฉ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. `uconv`๋ ๋ช๊ฐ์ง ๋ณต์กํ ์ ๋์ฝ๋๋ฅผ ์ง์ํฉ๋๋ค. ์๋ฅผ๋ค์ด, ์๋ฌธ์ํํ๊ณ ๋ชจ๋ ์ ์ผํธ๋ฅผ ์ ๊ฑฐํ๋(ํ์ฅํ๊ณ , ๋จ์ดํธ๋ฆฌ๋ ๊ฒ์ ์ด์ฉํด์) ์ปค๋งจ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ```sh uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt ``` - ํ์ผ์ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋๋๋ ค๋ฉด `split`(ํ์ผ์ ์ฌ์ด์ฆ๋ก ๋๋)์ด๋ `csplit`(ํ์ผ์ ํจํด์ผ๋ก ๋๋)์ ๋ณด์ธ์. - `zless`, `zmore`, `zcat` ๊ทธ๋ฆฌ๊ณ `zgrep`์ ์ด์ฉํด์ ์์ถ๋ ํ์ผ์ ๋ํด ์์ ํ์ธ์. ## System debugging - ์น ๋๋ฒ๊น ์ ์ํด์๋ `curl` ์ `curl -I` ๊ฐ ๋์์ด ๋๊ณ , `wget`๋ ๊ฝค ๋์์ด ๋ฉ๋๋ค. ๊ทธ์ธ์ ๋ณด๋ค ํ๋์ ์ธ ๋ฐฉ์์ผ๋ก๋ [`httpie`](https://github.com/jakubroztocil/httpie)์ด ์์ต๋๋ค. - ๋์คํฌ/cpu/๋คํธ์ํฌ์ ์ํ๋ฅผ ์๊ธฐ ์ํด์๋ ๊ฐ๊ฐ `iostat`, `netstat`, `top` (ํน์ ๋ ๋์ ๋ช ๋ น์ด์ธ `htop`), ๊ทธ๋ฆฌ๊ณ ํนํ `dstat`์ ์ฌ์ฉํ์ธ์. ์์คํ ์ ์ด๋ ํ์ผ์ด ์ผ์ด๋ฌ๋์ง๋ฅผ ๋น ๋ฅด๊ฒ ์์๋ด๋๋ฐ ๋งค์ฐ ์ข์ต๋๋ค. - ๋ณด๋ค ์์คํ ์ ์ฌ์ธต์ ์ธ ๋ฉด๋ค์ ๋ณด๋ ค๋ฉด [`glances`](https://github.com/nicolargo/glances)๋ฅผ ์ฌ์ฉํด๋ณด์ธ์. ์ด ์ปค๋งจ๋๋ ํ ํฐ๋ฏธ๋์์ ์ฌ๋ฌ ์์คํ ์์ค์ ํต๊ณ์๋ฃ๋ค์ ๋ณด์ฌ์ค๋๋ค. ๋น ๋ฅด๊ฒ ์ฌ๋ฌ ์๋ธ์์คํ ๋ค์ ์ฒดํฌํ๋๋ฐ ๋งค์ฐ ํฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค. - ๋ฉ๋ชจ๋ฆฌ์ ์ํ๋ฅผ ์์๋ณด๋ ค๋ฉด `free` ์ `vmstat`๋ฅผ ์คํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํด์ํด๋ณด์ธ์. ํนํ, "cached" ๊ฐ์ Linux kernel์ ์ํด file cache๋ก ์กํ์๋ ๋ฉ๋ชจ๋ฆฌ ๋ผ๋ ๊ฒ์ ์๊ณ ์์ด์ผ ํ๊ณ ๊ทธ๋์ "free"๊ฐ์ ๋ํด์ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ๊ณ์ฐํ ์ ์์ต๋๋ค. - Java ์์คํ ์ ๋๋ฒ๊น ์ ์กฐ๊ธ ๋ค๋ฅธ์ํฉ์ ๋๋ค. ํ์ง๋ง Oracle๊ณผ ๊ทธ ์ธ์ ํ์ฌ์์ ๋ง๋ ๋ค๋ฅธ JVM๋ค์์๋ `kill -3 <pid>`๋ฅผ ์คํํ๋ฉด ์ ์ฒด stack trace์ ๋ณด์ heap์ ์ ๋ณด(์๊ธฐ๋ณ๋ก ๊ฐ๋น์ง ์ฝ๋ ํฐ์ ์ธ๋ถ์ ์ธ ๋ด์ฉ๊ฐ์ ๋งค์ฐ ์ ์ฉํ ์ ๋ณด)๋ฅผ ์์ฝํ์ฌ stderr๋ ๋ก๊ทธ๋ก ์ถ๋ ฅํด์ฃผ๋ฏ๋ก ๊ฐ๋จํ๊ฒ ์ ๋ณด๋ฅผ ์ป์ด์ฌ ์ ์์ต๋๋ค. JDK์ `jps`, `jstat`, `jstack`, `jmap` ๋ช ๋ น์ ์ ์ฉํฉ๋๋ค. [SJK tools](https://github.com/aragozin/jvm-tools)์ ๋ ๊ณ ๊ธ ์ ๋ณด๋ฅผ ๋ค๋ฃฐ ์ ์์ต๋๋ค. - ๋คํธ์ํฌ ์ด์๋ค์ ์์๋ณด๊ธฐ ์ํด์๋ traceroute๋ฅผ ์ฌ์ฉํ ์๋ ์์ง๋ง ์ด๋ณด๋ค ๋ ์ข์ `mtr`๋ฅผ ์ฌ์ฉํ์ธ์. - ๋์คํฌ๊ฐ ์ ๊ฐ๋์ฐผ๋์ง ์์๋ณด๊ธฐ ์ํด์ `ncdu`๋ฅผ ์ฌ์ฉํด๋ณด์ธ์. ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ `du -sh *`์ ๊ฐ์ ์ปค๋ฉ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค๋ ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค. - ์ด๋ ํ ์์ผ์ด๋ ํ๋ก์ธ์ค๊ฐ ์ฌ์ฉํ๋ ๋์ญํญ(bandwidth)๋ฅผ ์ฐพ์๋ณด๋ ค๋ฉด `iftop`๋ `nethogs`๋ฅผ ์ฌ์ฉํ์ธ์. - `ab`๋ผ๋ ํด(Apache์ ๋ธ๋ ค์๋)์ ์ ์ํ๊ณ ๊ฐ๋จํ๊ฒ(quick-and-dirty) ์น์๋ฒ์ ์ฑ๋ฅ์ ์ฒดํฌํ๋๋ฐ ์ ์ฉํฉ๋๋ค. ๋ณด๋ค ๋ณต์กํ ๋ถํ ํ ์คํธ๋ฅผ ํ ๋๋ `siege`๋ฅผ ์ฌ์ฉํด๋ณด์ธ์. - ๋ณด๋ค ์ฌ๊ฐํ ๊ฒฝ์ฐ์ ๋คํธ์ํฌ ๋๋ฒ๊น ์ ์ํด์๋ `wireshark`, `tshark` ๋๋ `ngrep`๋ฅผ ์ฌ์ฉํ์ธ์. - `strace` ์ `ltrace`์ ๋ํด์ ์์๋ณด์ธ์. ์ด ์ปค๋งจ๋๋ค์ ๋ง์ผ ์ด๋ค ํ๋ก๊ทธ๋จ์์ failing, hanging ํน์ crashing์ด ์ผ์ด๋๊ฑฐ๋ ๊ทธ ์ธ์ ์ฌ๋ฌ๋ถ์ด ๋ฌด์จ์ด์ ์ธ์ง ์์ง ๋ชปํ๋ ์ํฉ์ด๋ ์ฑ๋ฅ์ ๋ํ ๋๋ต์ ์ธ ๋ด์ฉ์ ์ป๊ณ ์ ํ ๋ ์ ์ฉํ ๊ฒ์ ๋๋ค. ํนํ ํ๋กํ์ผ๋ง์ ์ํ ์ต์ (`-c`)๊ณผ ํ์ฌ ์คํ์ค์ธ ํ๋ก์ธ์ค์ ๋ถ์ด๊ธฐ ์ํ ์ต์ (`-p`)์ ๊ธฐ์ตํ์ธ์. - ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(shared libraries) ๋ฑ์ ์ฒดํฌํ๊ธฐ ์ํด์๋ `ldd`์ ๋ํด ์์๋ณด์ธ์. - `gdb`๋ฅผ ๊ฐ์ง๊ณ ํ์ฌ ์คํ์ค์ธ ํ๋ก์ธ์ค์ ์ฐ๊ฒฐํ๊ณ ๊ทธ ํ๋ก์ธ์ค์ stack trace๋ค์ ์ป๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์. - `/proc`๋ฅผ ์ฌ์ฉํ์ธ์. ์ด๊ฒ์ ํ์ฌ ๋ฐ์ํ๊ณ ์๋ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ ๋ ์ข ์ข ๋๋๋๋ก ํฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์์:`/proc/cpuinfo`, `/proc/meminfo`, `/proc/cmdline`, `/proc/xxx/cwd`, `/proc/xxx/exe`, `/proc/xxx/fd/`, `/proc/xxx/smaps` (`xxx`๋ ํ๋ก์ธ์ค id๋ pid์ ๋๋ค). - ๊ณผ๊ฑฐ์ ์ ๋ฌด์์ธ๊ฐ๊ฐ ์๋ชป๋์๋์ง๋ฅผ ๋๋ฒ๊น ํ ๋์๋ `sar`๊ฐ ๋งค์ฐ ์ ์ฉํ ๊ฒ์ ๋๋ค. ์ด ์ปค๋งจ๋๋ CPU, memory, network ๋ฑ์ ํต๊ณ ๋ด์ญ์ ๋ณด์ฌ์ค๋๋ค. - ์์คํ ์ ๋ณด๋ค ๊น์๊ณณ์ ๋ณด๊ฑฐ๋ ํผํฌ๋จผ์ค๋ฅผ ๋ถ์ํ๊ธฐ ์ํด์๋, `stap` ([SystemTap](https://sourceware.org/systemtap/wiki)),๋ [`perf`](http://en.wikipedia.org/wiki/Perf_(Linux)), ๊ทธ๋ฆฌ๊ณ [`sysdig`](https://github.com/draios/sysdig)๋ฅผ ์ฌ์ฉํด๋ณด์ธ์. - ์ฌ๋ฌ๋ถ์ด ์ฌ์ฉํ๋ Linux์ ๋ฐฐํฌํ์ด ๋ฌด์์ธ์ง ํ์ธ(๋๋ถ๋ถ์ ๋ฐฐํฌํ์์ ์๋ํฉ๋๋ค)ํ๋ ค๋ฉด `uname`์ด๋ `uname -a` ๋๋ `lsb_release -a`๋ฅผ ์ฌ์ฉํ์ธ์. - ์ธ์ ๋ ์ง ๋ฌด์ธ๊ฐ๊ฐ ์ ๋ง๋ก ์ฌ๋ฏธ์๋ ๋ฐ์์ ๋ณด์ธ๋ค๋ฉด `dmesg`๋ฅผ ์ฌ์ฉํด๋ณด์ธ์ (์๋ง๋ ํ๋์จ์ด๋ ๋๋ผ์ด๋ฒ์ ๋ฌธ์ ์ผ ๊ฒ์ ๋๋ค). ## One-liners ์ปค๋งจ๋๋ค์ ํ๋ฐ ๋ฌถ์ด์ ์ฌ์ฉํ๋ ์์ ๋ค - `sort`/`uniq`๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ ํ์ผ์ ๊ต์ฐจ์ , ์กฐํฉ, ์ฐจ์ด์ ์ ํ์ธ์ด ํ์ํ ๋ ์๋นํ ๋์์ด ๋ ๊ฒ๋๋ค. ๊ฐ๋ น `a`์ `b`๊ฐ ์ ์ผํ ๊ฐ๋ค๋ง์ ๊ฐ์ง ํ ์คํธ ํ์ผ์ด๋ผํฉ์๋ค. ์ด๊ฒ์ด ์์์ ํฌ๊ธฐ์ธ ํ์ผ์(๊ทธ๊ฒ ๊ธฐ๊ฐ๋ฐ์ดํธ๋ผ๊ณ ํด๋) ๋น ๋ฅด๊ฒ ์์ ํ ์ ์์ต๋๋ค. (Sort๋ ๋ฉ๋ชจ๋ฆฌ ์ ํ์ ๊ฑธ๋ฆฌ์ง ์์ต๋๋ค๋ง, ๋ง์ฝ ๋ฃจํธ ํํฐ์ ์ด ์์ ๊ฒฝ์ฐ, `/tmp`๋ฅผ ์ฌ์ฉํ๊ธฐ์ํด `-T`์ต์ ์ ์ฌ์ฉํ๋ฉด๋ฉ๋๋ค.) ์์ `LC_ALL`์๋ํ ๋ด์ฉ์ `sort`์ `-u`์ต์ ์ ํ์ธํ์ญ์์ค. (์๋ ์์ ์ ์ง์คํ๊ธฐ ์ํด์ ์๋ต) ```sh cat a b | sort | uniq > c # c is a union b cat a b | sort | uniq -d > c # c is a intersect b cat a b b | sort | uniq -u > c # c is set difference a - b ``` - `grep . *`์ ์ฌ์ฉํด์ ๋๋ ํ ๋ฆฌ ์์ ๋ชจ๋ ํ์ผ์ ๋น์ฃผ์ผํ๊ฒ ์ดํด ๋ณผ ์ ์์ต๋๋ค. ์๋ฅผ๋ค์ด `/sys`, `/proc`, `/etc` ๊ฐ์ด ์ค์ ๊ฐ๋ค๋ก ๊ฐ๋ํ ๋๋ ํ ๋ฆฌ์ ๋ง์ด์ฃ . - ํ ์คํธ ํ์ผ์ ์ธ๋ฒ์งธ ์ด์ ์ซ์๋ค์ ๋ชจ๋ ๊ฐ์ ๋ํ๋ ๊ฒ์ ์ด๋ ๊ฒ ํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๊ฐ์ ์ผ์ ํ๋ ํ์ด์ฌ ์ฝ๋๋ณด๋ค 3๋ฐฐ์ ๋ ๋น ๋ฅด๊ณ , 1/3์ ๋์ ๊ธธ์ด๋ฐ์ ์๋ฉ๋๋ค. ```sh awk '{ x += $3 } END { print x }' myfile ``` - ํ์ผ ํธ๋ฆฌ์์ ํฌ๊ธฐ์ ๋ ์ง๋ฅผ ๋ณด๋ ค๋ฉด ์ด๋ ๊ฒ ํ์ธ์. ์ด ๋ช ๋ น์ด๋ `ls -l`์ ์ฌ๊ท์ ์ผ๋ก ์ํํ๋ ๊ฒ๊ณผ ๊ฐ์ง๋ง, `ls -lR`๋ณด๋ค ๋ ์ฝ๊ธฐ ์ฝ์ต๋๋ค. ```sh find . -type f -ls ``` - ์น์๋ฒ ๋ก๊ทธ๊ฐ์ ํ ์คํธ ํ์ผ์ด ์๋ค๊ณ ํฉ์๋ค. ๊ทธ๋ฆฌ๊ณ URL ํ๋ผ๋ฉํฐ์ ๋ํ๋๋ `acct_id`๊ฐ์ ํน์ ๊ฐ์ด ๋ช๋ช ํ์ ๋ํ๋๋ค๊ณ ํด๋ณด์ฃ . ๊ฐ๊ฐ์ `acct_id`์ ๋ํด ์ผ๋ง๋ ๋ง์ ์์ฒญ์ด ์์๋์ง ์๊ณ ์ถ๋ค๋ฉด ๋ค์์ฒ๋ผ ํ ์ ์์ต๋๋ค. ```sh cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn ``` - ๋ค์ ํจ์๋ฅผ ์คํํ๋ฉด ์ด ๋ฌธ์์ ์๋ ํ ์ค ์์์ ๊ฒ์ ์ป์ ์ ์์ต๋๋ค(๋งํฌ๋ค์ด์ ํ์ฑํ๊ณ ํญ๋ชฉ์ ์ถ์ถํฉ๋๋ค). ```sh function taocl() { curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md | pandoc -f markdown -t html | xmlstarlet fo --html --dropdtd | xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" | xmlstarlet unesc | fmt -80 } ``` ## Obscure but useful - `expr`: ์ฐ์ ์ ์ด๊ฑฐ๋ ๋ ผ๋ฆฌ์ ์ธ ์์ ์ ์ํํ๊ฑฐ๋ ์ ๊ทํํ์์ ๊ฒ์ฆํ ๋ ์ฌ์ฉํฉ๋๋ค - `m4`: ๊ฐ๋จํ ๋ฉํฌ๋ก ์ํ๊ธฐ๋ฅผ ์คํํฉ๋๋ค - `yes`: ์ด๋ ํ ํ ๋ฌธ์ฅ์ ๋งค์ฐ ๋ง์ด ์ถ๋ ฅํฉ๋๋ค - `cal`: ๊ฐ๋จํ ๋ฌ๋ ฅ์ ๋ณด์ฌ์ค๋๋ค - `env`: ์ด๋ค ํ ์ปค๋งจ๋๋ฅผ ์คํํฉ๋๋ค(์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค๋ ์ ์ฉํฉ๋๋ค) - `printenv`: ํ๊ฒฝ ๋ณ์๋ค์ ์ถ๋ ฅํฉ๋๋ค(๋๋ฒ๊น ์ ํ ๋๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค๋ ์ ์ฉํฉ๋๋ค) - `look`: ์ด๋ค ๋ฌธ์์ด๋ก ์์ํ๋ ์๋จ์ด(ํน์ ํ์ผ์ ์ด๋ค ํ ์ค)์ ์ฐพ์ต๋๋ค - `cut `, `paste` ๊ทธ๋ฆฌ๊ณ `join`: ๋ฐ์ดํฐ๋ฅผ ์์ ํ ๋ ์ฌ์ฉํฉ๋๋ค - `fmt`: ๋ฌธ๋จ์ ์์์ ์ง์ ํฉ๋๋ค - `pr`: ๋ฌธ์์ ํ์ด์ง๋ ์ปฌ๋ผ ์์์ ์ง์ ํฉ๋๋ค - `fold`: ๋ฌธ์์ ๊ฐ ๋ผ์ธ๋ค์ ํน์ ํ ๊ธธ์ด์ ๋ง๊ฒ ์์ ํฉ๋๋ค - `column`: ๋ฌธ์์ ์ปฌ๋ผ์ด๋ ํ ์ด๋ธ์ ์์์ ์ง์ ํฉ๋๋ค - `expand` and `unexpand`: ํญ์ ๊ณต๋ฐฑ์ผ๋ก ๋ฐ๊พธ์ด์ฃผ๊ฑฐ๋ ๊ณต๋ฐฑ์ ํญ์ผ๋ก ๋ฐ๊พธ์ด์ค๋๋ค - `nl`: ์ค ๋ฒํธ๋ฅผ ์ถ๊ฐํด์ค๋๋ค - `seq`: ์ซ์๋ค์ ์ถ๋ ฅํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค - `bc`: ๊ฐ๋จํ ๊ณ์ฐ๊ธฐ๋ฅผ ์คํํฉ๋๋ค - `factor`: ์ ์๋ค์ ์ธ์๋ถํดํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค - [`gpg`](https://gnupg.org/): ํ์ผ๋ค์ ์ํธํํ๊ณ ์๋ช ํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค - `toe`: terminfo ์ํธ๋ฆฌ๋ค์ ํ ์ด๋ธ(table of terminfo entries) - `nc`: ๋คํธ์ํฌ๋ฅผ ๋๋ฒ๊น ํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์ฌ์ฉํฉ๋๋ค - `socat`: ์์ผ ๋ฆด๋ ์ด๋ TCP ํฌํธ๋ก ๋ด์ฉ์ ์ ๋ฌํ ๋ ์ฌ์ฉํฉ๋๋ค(`netcat`๊ณผ ๋น์ทํฉ๋๋ค) - [`slurm`](https://github.com/mattthias/slurm): ๋คํธ์ํฌ ์ํฉ์ ์๊ฐํํ์ฌ ๋ณด์ฌ์ค๋๋ค - `dd`: ํ์ผ๋ค์ด๋ ๋๋ฐ์ด์ค๋ค ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฎ๊ธธ๋ ์ฌ์ฉํฉ๋๋ค - `file`: ํ์ผ์ ์ข ๋ฅ๋ฅผ ์์๋ด๋๋ฐ ์ฌ์ฉํฉ๋๋ค - `tree`: ๋๋ ํ ๋ฆฌ๋ค๊ณผ ๊ทธ ํ์ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง์น ls๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ์ ๋ ฅํ ๊ฒ์ฒ๋ผ ํธ๋ฆฌ์ ํํ๋ก ๋ณด์ฌ์ค๋๋ค - `stat`: ํ์ผ์ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค - `time`: execute and time a command - `tac`: ํ์ผ์ ๋ด์ฉ์ ์ญ์์ผ๋ก ์ถ๋ ฅํฉ๋๋ค - `shuf`: ํ์ผ์ ๊ฐ ์ค๋ค์ ์์์ ์์๋ก ์ถ๋ ฅํฉ๋๋ค - `comm`: ์ ๋ ฌ๋ ํ์ผ๋ค์ ๊ฐ ๋ผ์ธ๋ณ๋ก ๋น๊ตํฉ๋๋ค - `pv`: ํ์ดํ๋ฅผ ํตํด์ ํ๋ก์ธ์ค์ ์ ๋ณด๋ฅผ ๋ชจ๋ํฐ๋งํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค - `hd` and `bvi`: ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ์์ ํ๊ฑฐ๋ ๋คํ๋ฅผ ์ป์ด์ค๋๋ฐ ์ฌ์ฉํฉ๋๋ค - `strings`: ๋ฐ์ด๋๋ฆฌ ํ์ผ๋ค์์ ํน์ ๋ฌธ์ฅ์ ์ถ์ถํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค - `tr`: ๋ฌธ์๋ฅผ ๋ณํํ๊ฑฐ๋ ์กฐ์ํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค - `iconv` or `uconv`: ๋ฌธ์์ ์ธ์ฝ๋ฉ๋ฐฉ์์ ๋ณํํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค - `split `and `csplit`: ํ์ผ๋ค์ ์ชผ๊ฐ๋๋ฐ ์ฌ์ฉํฉ๋๋ค - `sponge`: ์ฐ๊ธฐ ์ ์ ๋ชจ๋ ์ ๋ ฅ์ ์ฝ์ต๋๋ค. ๊ฐ์ ํ์ผ์์ ์ฝ์ ํ์ ์ฐ๊ธฐ์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด `grep -v something some-file | sponge some-file`์ฒ๋ผ ์ฌ์ฉํ ์ ์์ต๋๋ค. - `units`: ๋จ์๋ฅผ ๋ณํํ๊ฑฐ๋ ๊ณ์ฐํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค ์๋ฅผ๋ค์ด furlongs/fortnight ๋จ์๋ฅผ twips/blink๋ก ๋ณํํฉ๋๋ค (`/usr/share/units/definitions.units`๋ฅผ ์ฐธ๊ณ ํ์ธ์) - `7z`: ๊ณ ํจ์จ์ ํ์ผ ์์ถํ๋ก๊ทธ๋จ์ ๋๋ค - `ldd`: ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค - `nm`: ์ค๋ธ์ ํธ ํ์ผ๋ค์ ํฌํจ๋ ์ฌ๋ณผ์ ๋ณด๋ฅผ ์ป์ด์ต๋๋ค - `ab`: ์น ์๋ฒ๋ฅผ ๋ฒค์น ๋งํนํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค - `strace`: ์์คํ ์ฝ์ ๋๋ฒ๊น ํ ๋ ์ฌ์ฉํฉ๋๋ค - `mtr`: ๋คํธ์ํฌ ๋๋ฒ๊น ์์ traceroute๋ณด๋ค ๋ ๋ซ์ต๋๋ค - `cssh`: ์์ ๋์์ ์ฌ๋ฌ๊ฐ ์ฌ์ฉํ ๋ ์ฌ์ฉํฉ๋๋ค - `rsync`: SSH๋ฅผ ์ด์ฉํด ์๊ฒฉ ํ์ผ ์์คํ ์ด๋, ๋ก์ปฌ ํ์ผ์์คํ ์ ํ์ผ๊ณผ ํด๋๋ค์ ๋๊ธฐํ ํ ๋ ์ฌ์ฉํฉ๋๋ค - `wireshark` and `tshark`: ํจํท์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ฉฐ ๋คํธ์ํน์ ๋๋ฒ๊น ํ๋๋ฐ ์ฌ์ฉํฉ๋๋ค - `ngrep`: ๋คํธ์ํฌ ํ๊ฒฝ์์ grep๊ณผ ๊ฐ์ ์ญํ ์ ํฉ๋๋ค - `host` and `dig`: DNS ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค - `lsof`: ํ๋ก์ธ์ค ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ์์ผ์ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค - `dstat`: ์ ์ฉํ ์์คํ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค - [`glances`](https://github.com/nicolargo/glances): ๋ณด๋ค ๊ณ ์ฐจ์์ ์ฌ๋ฌ ์๋ธ์์คํ ๋ค์ ์ ๋ณด๋ฅผ ํ๋ฒ์ ๋ณด์ฌ์ค๋๋ค - `iostat`: ๋์คํฌ์ ์ฌ์ฉ๋ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค - `mpstat`: CPU ์ฌ์ฉ๋ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค. - `vmstat`: ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค. - `htop`: ๋ณด๋ค ๊ฐ์ ๋ ํํ์ top์ ๋ณด์ฌ์ค๋๋ค - `last`: ๋ก๊ทธ์ธ ํ๋ ์ ๋ณด๋ค์ ๋ณด์ฌ์ค๋๋ค - `w`: ํ์ฌ ๋๊ฐ ๋ก๊ทธ์ธํ๋์ง ๋ณด์ฌ์ค๋๋ค - `id`: ํ์ฌ ์ ์ ๋ ๊ทธ๋ฃน์ ๋ํ ์๋ณ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค - `sar`: ์์คํ ์ํ์ ๋ํ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค - `iftop` or `nethogs`: ์์ผ ๋๋ ํ๋ก์ธ์ค๋ฅผ ์ด์ฉํ์ฌ ๋คํธ์ํฌ๋ฅผ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค - `ss`: ์์ผ์ ๊ดํ ํต๊ณ์๋ฃ๋ค์ ๋ณด์ฌ์ค๋๋ค - `dmesg`: ๋ถํ ๋ฉ์์ง์ ์์คํ ์๋ฌ ๋ฉ์์ง๋ค์ ๋ณด์ฌ์ค๋๋ค - `hdparm`: SATA/ATA disk๋ค์ ์ ๋ณด๋ฅผ ์์ ํ๊ฑฐ๋ ๊ทธ๊ฒ๋ค์ด ์๋ํ๋๋ก ํฉ๋๋ค. - `lsb_release`: Linux ๋ฐฐํฌํ์ ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค - `lsblk`: ๋ธ๋ก ๋๋ฐ์ด์ค๋ค์ ๋ชฉ๋ก์ ๋ณด์ฌ์ค๋๋ค : ์ฌ๋ฌ๋ถ์ ๋์คํฌ๋ค์ด๋ ๋์คํฌํํฐ์ ๋ค์ ํธ๋ฆฌ์ ํํ๋ก ๋ณด์ฌ์ค๋๋ค - `lshw`, `lscpu`, `lspci`, `lsusb`, `dmidecode`: CPU, BIOS, RAID, graphics, devices ๋ฑ์ ํ๋์จ์ด ์ ๋ณด๋ฅผ ๋ณด์ฌ์ค๋๋ค - `lsmod`์ `modifno`: ์ปค๋ ๋ชจ๋์ ์์ธ์ ๋ณด๋ฅผ ๋ชฉ๋ก์ผ๋ก ๋ณด์ฌ์ค๋๋ค. - `fortune`, `ddate`, ๊ทธ๋ฆฌ๊ณ `sl`: ์... ์ฆ๊ธฐ๊ธฐ๊ด์ฐจ๋ฅผ ์๊ฐํ๊ณ ์๊ณ ๊ทธ๊ฒ์ ์ธ์ฉํ๊ณ ์ถ๋ค๋ฉด ์ด๊ฒ์ "์ ์ฉ"ํฉ๋๋ค ## OS X only *MacOS์์๋ง* ํด๋น๋๋ ํญ๋ชฉ์ ๋๋ค. - `brew` (Homebrew)๋ `port` (MacPorts)๋ฅผ ํจํค์ง ๋ฉ๋์ ๋ก ์ฌ์ฉํฉ๋๋ค. ๋ณด๋ค ๋ง์ ๋ช ๋ น์ด๋ฅผ MacOS์ ์ค์นํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค. - `pbcopy`๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์คํฌํ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ช ๋ น์ด ์ถ๋ ฅ๋ฌผ์ ๋ณต์ฌํ๊ฑฐ๋ `pbpaste`๋ฅผ ์ด์ฉํด ๋ถ์ฌ๋ฃ๊ธฐ๋ฅผ ํ ์ ์์ต๋๋ค. - ๋ฐ์คํฌํ ์ดํ๋ฆฌ์ผ์ด์ ์์ ํ์ผ์ ์ด๊ธฐ์ํด, `open` ๋๋ `open -a /Applications/Whatever.app`์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. - Spotlight: `mdfind`๋ฅผ ์ด์ฉํด ํ์ผ์ ์ฐพ๊ณ , `mdls`๋ฅผ ์ด์ฉํด ๋ฉํ๋ฐ์ดํ (์ฌ์ง EXIF ์ ๋ณด์ ๊ฐ์) ๋ชฉ๋ก์ ๋ณผ ์ ์์ต๋๋ค. - MacOS๋ BSD Unix ๊ธฐ๋ฐ์ด๋ฉฐ ๋ง์ ๋ช ๋ น์ด๋ค์ (์๋ก `ps`, `ls`, `tail`, `awk`, `sed`) ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๊ฒ๋ค์ Linux ๋ฒ์ ๋ค๊ณผ ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ํฌ๊ฒ๋ System V-style Unix์ GNU ๋๊ตฌ๋ค์ ๋ง์ ์ํฅ์ ๋ฐ์์ต๋๋ค. ์ด๋ฐ ๋ด์ฉ๋ค์ man ํ์ด์ง ์๋จ์ "BSD General Commands Manual." ๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ํตํด ์ ์ ์์ต๋๋ค. ๊ฐ๋์ GNU ๋ฒ์ ์ด ์ค์น๋๊ธฐ๋ํฉ๋๋ค. (์๋ก, GNU awk์ sed์ธ `gawk`์ `gsed`์์). ๋ง์ฝ ์ด์ข ํ๋ซํผ๊ฐ Bash ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ ค๋ฉด, ๋์ผํ ๋ช ๋ น์ด (์๋ก, ํ์ด์ฌ์ด๋ `perl`๊ณผ ๊ฐ์)๋ ํ ์คํธ์ ์ฃผ์ํด์ผํฉ๋๋ค. ## More resources - [awesome-shell](https://github.com/alebcay/awesome-shell): ์์ ๋ํ ํด๊ณผ ๋ฆฌ์์ค๋ค์ด ์ ์ ๋ฆฌ๋์ด ์๋ ๋ฆฌ์คํธ์ ๋๋ค. - [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/): ๋ณด๋ค ๋์ ์์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ ๋ณด๊ธ์ ๋๋ค. ## Disclaimer ๋งค์ฐ ์์ ์์ ์ ์ ์ธํ ์ฝ๋๋ค์ ๋ค๋ฅธ ์ฌ๋์ด ์ฝ์ ์ ์๋๋ก ์์ฑ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ด์ฉ์ ์์ฑ์ ์ ์์๊ฒ ์ฑ ์์ด ์์ต๋๋ค. Bash์์ ๋ญ๊ฐ๋ฅผ *ํ ์ ์๋ค๋* ๊ฒ์ด ๋น์ ์ด ๋ญ๊ฐ๋ฅผ ํด์ผ๋๋ค๋ ๊ฒ์ ๊ฐ์ํ๋ ๊ฒ์ด ์๋๋ค! ;) ## License [![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) ์ด ์ ์๋ฌผ์ [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/)์ ๋ฐ๋ผ ์ด์ฉํ ์ ์์ต๋๋ค.