๐ŸŒ *[ฤŒ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`๊ฐ™์€ ๋ช…๋ น์–ด๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข…์ข…, ์ปค๋งจ๋“œ๊ฐ€ ์—ด๋ฆฐ ํŒŒ์ผ ํ•ธ๋“ค์„ ๋‚จ๊ธฐ์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์‹คํžˆ ํ•˜๊ธฐ ์œ„ํ•ด, ํ˜„์žฌ ์ž‘์—…์ค‘์ธ ํ„ฐ๋ฏธ๋„์—์„œ ๋ช…๋ น์–ด์— ` 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 `๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ „์ฒด 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/)์— ๋”ฐ๋ผ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.