├── .gitignore ├── AUTHORS.md ├── README-es.md ├── README-it.md ├── README-ja.md ├── README-ko.md ├── README-pt.md ├── README-ru.md ├── README-sl.md ├── README-uk.md ├── README-zh-cn.md ├── README-zh-tw.md ├── README.md ├── admin └── authors-info.yml └── cowsay.png /.gitignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | -------------------------------------------------------------------------------- /AUTHORS.md: -------------------------------------------------------------------------------- 1 | # Authors 2 | 3 | This work is the result of the effort of many people around the world. 4 | Contributors are listed in alphabetical order by GitHub login. 5 | 6 | 7 | * [Antonio Ossa (aaossa)](https://github.com/aaossa) — [5+](https://github.com/jlevy/the-art-of-command-line/commits?author=aaossa)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Aaaossa) — _translator (es)_ 8 | * [Ahmet Alp Balkan (ahmetalpbalkan)](https://github.com/ahmetalpbalkan) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=ahmetalpbalkan)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Aahmetalpbalkan) 9 | * [Semir Patel (analogue)](https://github.com/analogue) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=analogue)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Aanalogue) 10 | * [Desmond Stonie (aneasystone)](https://github.com/aneasystone) — [3+](https://github.com/jlevy/the-art-of-command-line/commits?author=aneasystone)/[8+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Aaneasystone) 11 | * [Guo Chong (Armour)](https://github.com/Armour) — [2+](https://github.com/jlevy/the-art-of-command-line/commits?author=Armour)/[0+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3AArmour) — _translator (zh)_ 12 | * [Brad Beyenhof (augmentedfourth)](https://github.com/augmentedfourth) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=augmentedfourth)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Aaugmentedfourth) 13 | * [Alex Vergara Gil (BishopWolf)](https://github.com/BishopWolf) — [4+](https://github.com/jlevy/the-art-of-command-line/commits?author=BishopWolf)/[3+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3ABishopWolf) — _translator (es)_ 14 | * [Bryce J. (bj1)](https://github.com/bj1) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=bj1)/[0+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Abj1) 15 | * [Arturo Fernandez (bsnux)](https://github.com/bsnux) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=bsnux)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Absnux) 16 | * [Alex Cabrera (cabreraalex)](https://github.com/cabreraalex) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=cabreraalex)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Acabreraalex) 17 | * [Carlos Mantilla (ceoaliongroo)](https://github.com/ceoaliongroo) — [21+](https://github.com/jlevy/the-art-of-command-line/commits?author=ceoaliongroo)/[12+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Aceoaliongroo) — _translator and maintainer (es)_ 18 | * [Chris Kuehl (chriskuehl)](https://github.com/chriskuehl) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=chriskuehl)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Achriskuehl) 19 | * [Corey "See More" Richardson (cmr)](https://github.com/cmr) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=cmr)/[3+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Acmr) 20 | * [Colas BROUX (ColasBroux)](https://github.com/ColasBroux) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=ColasBroux)/[2+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3AColasBroux) 21 | * [Chris Rhodes (crr0004)](https://github.com/crr0004) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=crr0004)/[4+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Acrr0004) 22 | * [Chelsea Voss (csvoss)](https://github.com/csvoss) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=csvoss)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Acsvoss) 23 | * [Daniel t. (danasmera)](https://github.com/danasmera) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=danasmera)/[3+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Adanasmera) 24 | * [Dmytro Danylevskyi (danylevskyi)](https://github.com/danylevskyi) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=danylevskyi)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Adanylevskyi) 25 | * [Dave Loyall (daveloyall)](https://github.com/daveloyall) — [2+](https://github.com/jlevy/the-art-of-command-line/commits?author=daveloyall)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Adaveloyall) 26 | * [Deborah Digges (Deborah-Digges)](https://github.com/Deborah-Digges) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=Deborah-Digges)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3ADeborah-Digges) 27 | * [Jamie Luck (delucks)](https://github.com/delucks) — [2+](https://github.com/jlevy/the-art-of-command-line/commits?author=delucks)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Adelucks) 28 | * [Dima Paloskin (dimapaloskin)](https://github.com/dimapaloskin) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=dimapaloskin)/[0+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Adimapaloskin) 29 | * [Michael Diamond (dimo414)](https://github.com/dimo414) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=dimo414)/[4+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Adimo414) 30 | * [doublemarket (doublemarket)](https://github.com/doublemarket) — [2+](https://github.com/jlevy/the-art-of-command-line/commits?author=doublemarket)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Adoublemarket) — _translator and maintainer (ja)_ 31 | * [Vincent Wong (EaterOA)](https://github.com/EaterOA) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=EaterOA)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3AEaterOA) 32 | * [Fazle Arefin (fazlearefin)](https://github.com/fazlearefin) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=fazlearefin)/[2+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Afazlearefin) 33 | * [githubashto](https://github.com/githubashto) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=githubashto)/[0+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Agithubashto) — _translator (ru)_ 34 | * [Grigory Rechistov (grigory-rechistov)](https://github.com/grigory-rechistov) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=grigory-rechistov)/[0+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Agrigory-rechistov) — _translator (ru)_ 35 | * [Konstantin Gribov (grossws)](https://github.com/grossws) — [3+](https://github.com/jlevy/the-art-of-command-line/commits?author=grossws)/[6+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Agrossws) 36 | * [Beau Hastings (hastinbe)](https://github.com/hastinbe) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=hastinbe)/[4+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Ahastinbe) 37 | * [Sung Kim (hunkim)](https://github.com/hunkim) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=hunkim)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Ahunkim) — _translator (ko)_ 38 | * [Hunter-Github](https://github.com/Hunter-Github) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=Hunter-Github)/[3+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3AHunter-Github) 39 | * [Ivgeni "Iv" Segal (isegal)](https://github.com/isegal) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=isegal)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Aisegal) 40 | * [Alan Brogan (jalanb)](https://github.com/jalanb) — [2+](https://github.com/jlevy/the-art-of-command-line/commits?author=jalanb)/[3+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Ajalanb) 41 | * [Joshua Levy (jlevy)](https://github.com/jlevy) — [109+](https://github.com/jlevy/the-art-of-command-line/commits?author=jlevy)/[19+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Ajlevy) — _original author and maintainer_ 42 | * [Jesse Sightler (jsight)](https://github.com/jsight) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=jsight)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Ajsight) 43 | * [Konstantin Mikhaylov (jtraub)](https://github.com/jtraub) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=jtraub)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Ajtraub) 44 | * [Wael M. Nasreddine (kalbasit)](https://github.com/kalbasit) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=kalbasit)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Akalbasit) 45 | * [Colin Chan (kalgynirae)](https://github.com/kalgynirae) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=kalgynirae)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Akalgynirae) 46 | * [Michail Kargakis (kargakis)](https://github.com/kargakis) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=kargakis)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Akargakis) 47 | * [kstn (kastian)](https://github.com/kastian) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=kastian)/[0+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Akastian) — _translator (ru)_ 48 | * [Kesu J (kesu)](https://github.com/kesu) — [2+](https://github.com/jlevy/the-art-of-command-line/commits?author=kesu)/[3+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Akesu) 49 | * [Konstantin Ilyashenko (kostya13)](https://github.com/kostya13) — [2+](https://github.com/jlevy/the-art-of-command-line/commits?author=kostya13)/[0+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Akostya13) 50 | * [Pavel Zhukov (landgraf)](https://github.com/landgraf) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=landgraf)/[0+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Alandgraf) 51 | * [Matjaž Lipuš (matjaz)](https://github.com/matjaz) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=matjaz)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Amatjaz) 52 | * [Mayra Cabrera (mayra-cabrera)](https://github.com/mayra-cabrera) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=mayra-cabrera)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Amayra-cabrera) 53 | * [Michael Barlow (michaelbarlow7)](https://github.com/michaelbarlow7) — [2+](https://github.com/jlevy/the-art-of-command-line/commits?author=michaelbarlow7)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Amichaelbarlow7) 54 | * [Harry Moreno (morenoh149)](https://github.com/morenoh149) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=morenoh149)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Amorenoh149) 55 | * [Nilton Vasques (niltonvasques)](https://github.com/niltonvasques) — [24+](https://github.com/jlevy/the-art-of-command-line/commits?author=niltonvasques)/[2+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Aniltonvasques) — _translator and maintainer (pt)_ 56 | * [Oleg Berman (olegberman)](https://github.com/olegberman) — [15+](https://github.com/jlevy/the-art-of-command-line/commits?author=olegberman)/[2+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Aolegberman) — _translator and maintainer (ru)_ 57 | * [osmero](https://github.com/osmero) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=osmero)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Aosmero) — _translator (ru)_ 58 | * [Serg Petrov (p12se)](https://github.com/p12se) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=p12se)/[0+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Ap12se) 59 | * [Peter Kokot (peterkokot)](https://github.com/peterkokot) — [29+](https://github.com/jlevy/the-art-of-command-line/commits?author=peterkokot)/[20+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Apeterkokot) — _translator and maintainer (sl)_ 60 | * [曾楚杰 (Psycho7)](https://github.com/Psycho7) — [19+](https://github.com/jlevy/the-art-of-command-line/commits?author=Psycho7)/[8+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3APsycho7) — _translator and maintainer (zh)_ 61 | * [Rahul Kavale (rahulkavale)](https://github.com/rahulkavale) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=rahulkavale)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Arahulkavale) 62 | * [Raju Devidas Vindane (rajuvindane)](https://github.com/rajuvindane) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=rajuvindane)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Arajuvindane) 63 | * [Rasmus Wriedt Larsen (RasmusWL)](https://github.com/RasmusWL) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=RasmusWL)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3ARasmusWL) 64 | * [Saksham Sharma (saksham0808)](https://github.com/saksham0808) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=saksham0808)/[3+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Asaksham0808) 65 | * [Kit Chan (shukitchan)](https://github.com/shukitchan) — [2+](https://github.com/jlevy/the-art-of-command-line/commits?author=shukitchan)/[2+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Ashukitchan) 66 | * [Simarpreet Singh (simar7)](https://github.com/simar7) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=simar7)/[2+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Asimar7) 67 | * [Snowcat8436 (Snowcat8436)](https://github.com/Snowcat8436) — [4+](https://github.com/jlevy/the-art-of-command-line/commits?author=Snowcat8436)/[0+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3ASnowcat8436) — _translator (ko)_ 68 | * [Soham Chakraborty (SohamChakraborty)](https://github.com/SohamChakraborty) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=SohamChakraborty)/[3+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3ASohamChakraborty) 69 | * [spmbt (spmbt)](https://github.com/spmbt) — [13+](https://github.com/jlevy/the-art-of-command-line/commits?author=spmbt)/[0+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Aspmbt) — _translator (ru)_ 70 | * [Stepan Babala (stepan0904)](https://github.com/stepan0904) — [27+](https://github.com/jlevy/the-art-of-command-line/commits?author=stepan0904)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Astepan0904) — _translator and maintaner (uk)_ 71 | * [Steven Liu (stevenlordiam)](https://github.com/stevenlordiam) — [2+](https://github.com/jlevy/the-art-of-command-line/commits?author=stevenlordiam)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Astevenlordiam) — _translator (zh)_ 72 | * [Fabien Dubosson (StreakyCobra)](https://github.com/StreakyCobra) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=StreakyCobra)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3AStreakyCobra) 73 | * [taxusyew](https://github.com/taxusyew) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=taxusyew)/[2+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Ataxusyew) 74 | * [Sungjin Kang (ujuc)](https://github.com/ujuc) — [6+](https://github.com/jlevy/the-art-of-command-line/commits?author=ujuc)/[0+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Aujuc) — _translator (ko)_ 75 | * [Ungsik Yun (Ungsik-Yun)](https://github.com/Ungsik-Yun) — [15+](https://github.com/jlevy/the-art-of-command-line/commits?author=Ungsik-Yun)/[3+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3AUngsik-Yun) — _translator and maintainer (ko)_ 76 | * [Joe Block (unixorn)](https://github.com/unixorn) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=unixorn)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Aunixorn) 77 | * [Valeria de Paiva (vcvpaiva)](https://github.com/vcvpaiva) — [2+](https://github.com/jlevy/the-art-of-command-line/commits?author=vcvpaiva)/[0+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Avcvpaiva) — _translator (pt)_ 78 | * [Eduardo Rolim (vndmtrx)](https://github.com/vndmtrx) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=vndmtrx)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Avndmtrx) 79 | * [Okunev Yu Dmitry (xaionaro)](https://github.com/xaionaro) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=xaionaro)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Axaionaro) 80 | * [Chunyang Xu (xuchunyang)](https://github.com/xuchunyang) — [13+](https://github.com/jlevy/the-art-of-command-line/commits?author=xuchunyang)/[7+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Axuchunyang) — _translator (zh)_ 81 | * [Alex F. (youmee)](https://github.com/youmee) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=youmee)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Ayoumee) 82 | * [Zack Piper (zackp30)](https://github.com/zackp30) — [2+](https://github.com/jlevy/the-art-of-command-line/commits?author=zackp30)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Azackp30) 83 | * [Xudong Zhang (zxdvd)](https://github.com/zxdvd) — [1+](https://github.com/jlevy/the-art-of-command-line/commits?author=zxdvd)/[1+](https://github.com/jlevy/the-art-of-command-line/issues?q=author%3Azxdvd) 84 | 85 | Numbers link to commits/issues. 86 | For simplicity, this file is maintained only in English. 87 | 88 | If you see inaccuracies or omissions, please file an issue, or edit the authors-info.yml file, regenerate, and file a PR. 89 | 90 | 91 | 92 | (This file was auto-generated by [ghizmo assemble-authors](https://github.com/jlevy/ghizmo).) -------------------------------------------------------------------------------- /README-ja.md: -------------------------------------------------------------------------------- 1 | [ Languages: 2 | [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-cn.md), [繁體中文](README-zh-tw.md) 3 | ] 4 | 5 | 原文のコミット [bb0c38c0899339e836c37eead4a9534b06c56662](https://github.com/jlevy/the-art-of-command-line/blob/bb0c38c0899339e836c37eead4a9534b06c56662/README.md) 6 | 7 | # The Art of Command Line 8 | 9 | [![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) 10 | 11 | - [メタ情報](#meta) 12 | - [基本](#basics) 13 | - [日常的に使うもの](#everyday-use) 14 | - [ファイルとデータの処理](#processing-files-and-data) 15 | - [システムのデバッグ](#system-debugging) 16 | - [ワンライナー](#one-liners) 17 | - [目立たないが便利なもの](#obscure-but-useful) 18 | - [さらなるリソース](#more-resources) 19 | - [免責事項](#disclaimer) 20 | 21 | ![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/cowsay.png) 22 | 23 | コマンドラインで流れるように操作ができるということは、軽く見られたり他人から理解されないスキルだとみなされることもあるだろう。しかしそのスキルは、明らかにかすぐ分かるようかは問わず、エンジニアとしてのあなたの柔軟性や生産性を改善してくれるものだ。ここでは、Linuxでコマンドラインを使う上で便利だと思ったメモやTipsの数々を挙げてみる。あるものは基礎的だが、非常に詳しいもの、洗練されたもの、曖昧なものもある。このページはそんなに長いものではないが、ここに書いてあることの全てを使ったり思い出すことができれば、かなり詳しくなれるだろう。 24 | 25 | ここに書いてあることの多くは、[元々](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands)[Quora](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know)に[書かれて](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix)いたものが多いが、私よりももっと優れた人たちがすぐに改善案を出すことができるGithubに置くのがよいのではと思った(訳注 : 原文はGithub上にある)。間違いやもっとこうした方がよいという点があれば、イシューを登録するかプルリクエストを送ってほしい!(もちろん、メタ情報の項や既存のプルリクエスト、イシューをまず確認しよう) 26 | 27 | ## メタ情報 28 | 29 | 対象 : 30 | 31 | - このガイドは、初心者向けでも経験者向きでもある。幅広く(書いてあることは全て重要)、かつ明確で(多くのケースに対して具体的な例を付ける)、そして簡潔(他の場所で見つけられるような重要でないことや脱線したことは省く)であることをゴールにしている。各項目は、多くの場面において必須であるか、他の方法に比べて劇的に時間を節約してくれるだろう。 32 | - Linux向けに書いている。多くはMacOS(あるいはCygwin)でも使えるが、全部ではない。 33 | - インタラクティブなBashを使うことを想定しているが、多くの項目は他のシェルやBashのスクリプトでも使えるだろう。 34 | 35 | 注意 : 36 | 37 | - 1ページ内に収めるために、内容には暗黙的に書かれていることがある。ここで取りかかりを知ったりコマンドが分かれば、詳細をどこかで調べたりするくらいはできるだろう。新しいプログラムをインストールするには、`apt-get`/`yum`/`dnf`/`pacman`/`pip`/`brew`(どれか適したもの)を使おう。 38 | - コマンドやオプション、パイプを分解して理解する手助けに、[Explainshell](http://explainshell.com/)を使おう。 39 | 40 | ## 基本 41 | 42 | - 基本的なBashを学ぼう。実際のところ、`man bash`は結構簡単に理解できるしそんなに長くないので、これで一通りのことは分かる。それ以外のシェルもよいが、Bashは強力だし、常に使用可能であるという利点もある(自分のPCに入れてしまったと言ってzshやfishなど*だけ*を学んでしまうと、既存のサーバを触らなくてはならない時などに制約が出てしまう)。 43 | 44 | - テキストエディタのどれか最低1つに習熟しよう。ターミナル内で適当にものを書くにあたって他に全く代替品がないという点で、理想的にはVim(`vi`)がよいだろう(通常はEmacsや高機能なIDEや最新のかっこいいエディタをメインに使っていたとしても)。 45 | 46 | - `man`でのドキュメントの読み方を知ろう(知りたがりのために書くと、`man man`でセクション番号が分かる。例えば1は「一般的な」コマンド、5はファイルやそのお作法、8は管理についてといった具合)。`apropos`でmanページを探そう。コマンドによっては実行可能ファイルではなくBashのビルトインコマンドであることを理解し、`help`や`help -d`でヘルプが見られることを知ろう。 47 | 48 | - `>`や`<`、`|`を使ったパイプによる入出力のリダイレクションを学ぼう。stdout(標準出力)とstderr(標準エラー出力)を学ぼう。 49 | 50 | - `*`(または`?`や`{`...`}`)を使ったファイルグロブ展開、クォーテーション、ダブルクォート`"`とシングルクォート`'`の違いを学ぼう(詳しくはこの後の変数展開の項を参照)。 51 | 52 | - `&`、**ctrl-z**、**ctrl-c**、`jobs`、`fg`、`bg`、`kill`など、Bashのジョブ管理について詳しくなろう。 53 | 54 | - `ssh`について知るとともに、`ssh-agent`や`ssh-add`を使ったパスワードなしの認証の基本について理解しよう。 55 | 56 | - ファイル管理について。`ls`や`ls -l`(特に、`ls -l`の各列が何を意味するか理解)、`less`、`head`、`tail`、`tail -f`(または`less +F`)、`ln`と`ln -s`(ハードリンクとソフトリンクの違いとそれぞれの利点の理解)、`chown`と`chmod`、`du`(ディスク使用量まとめを簡単に見るなら`du -sk *`)。ファイルシステム管理については、`df`、`mount`、`fdisk`、`mkfs`、`lsblk`。 57 | 58 | - 基本的なネットワーク管理について。`ip`あるいは`ifconfig`、`dig`。 59 | 60 | - 正規表現について詳しく知ろう。`grep`や`egrep`の色々なフラグも合わせて。`-i`、`-o`、`-A`、`-B`といったオプションは知っておいて損はない。 61 | 62 | - `apt-get`、`yum`、`dnf`、`pacman`(ディストリビューションによって違う)といったコマンドでパッケージを探したりインストールする方法を学ぼう。Pythonベースのコマンドラインツールをインストールするのに、`pip`も必要だ(後に出てくるいくつかのコマンドは`pip`でインストールするのが一番簡単)。 63 | 64 | 65 | ## 日常的に使うもの 66 | 67 | - Bashでは、引数を補完するのに**タブ**を使い、コマンド履歴から検索するのに**ctrl-r**を使う。 68 | 69 | - Bashでは、最後の単語を削除するのには**ctrl-w**、行頭まで全て削除するには**ctrl-u**を使う。単語ごとに移動するには**alt-b**または**alt-f**、行末まで削除するには**ctrl-k**、画面のクリアは**ctrl-l**。Bashにおけるデフォルトのキー割り当てを全て見るには``man readline`を参照。たくさん出てくる。例えば、**alt-.**は前の引数を順番に表示し、**alt-***はグロブを展開する。 70 | 71 | - vi風のキー割り当てが好きなら、`set -o vi`を実行しよう。 72 | 73 | - 最近実行したコマンドを確認するなら`history`。**ctrl-r**や**alt-.**で用は足りるだろうが、`!$`(直前の引数)や`!!`(直前のコマンド)といった省略形もたくさんある。 74 | 75 | - 前のワーキングディレクトリに戻るなら`cd -` 76 | 77 | - 途中までコマンドを入力したけれど心変わりした時は、**alt-#**を打つと行頭に`#`が挿入され、コメントとして入力される(**ctrl-a**、**#**、**enter**でも同じ)。これは後でコマンド履歴から検索できる。 78 | 79 | - `xargs`(または`parallel`)を使おう。非常に強力。行ごとにいくつのアイテムを実行するか(`-L`)や、並列度(`-P`)も制御できる。正しく実行されるか定かでないなら、まず`xargs echo`してみればよい。`-I{}`も便利。例えば以下の通り。 80 | 81 | ```bash 82 | find . -name '*.py' | xargs grep some_function 83 | cat hosts | xargs -I{} ssh root@{} hostname 84 | ``` 85 | 86 | - `pstree -p`はプロセスツリーを表示するのに便利。 87 | 88 | - `pgrep`や`pkill`で、プロセス名で検索したりシグナルを送れる(`-f`も便利)。 89 | 90 | - プロセスに送れる色々なシグナルを知っておこう。例えば、プロセスをサスペンドするには`kill -STOP [pid]`を使う。全種類見るなら、`man 7 signal`。 91 | 92 | - バックグラウンドプロセスをずっと実行し続けたいなら`nohup`あるいは`disown`を使おう。 93 | 94 | - `netstat -lntp`や`ss -plat`で、どんなプロセスがリッスンしているか確認しよう(UDPなら`-u`を付ける)。 95 | 96 | - 開かれているソケットやファイルを見るには`lsof`も参照。 97 | 98 | - Bashスクリプトでは、`set -x`でデバッグ出力を出せる。可能なら厳格モードを使い、エラーが起きたら強制終了するよう`set -e`する。パイプのエラーも厳格に扱うために`set -o pipefail`も使おう(これはちょっと微妙かも)。より複雑なスクリプトなら、`trap`も使おう。 99 | 100 | - Bashスクリプトでは、コマンドのグループを作るのにサブシェル(丸括弧で囲まれた部分)が便利。一時的にワーキングディレクトリを移動するというよくある例。 101 | 102 | ```bash 103 | # カレントディレクトリで何か実行 104 | (cd /some/other/dir && other-command) 105 | # 元のディレクトリで作業続行 106 | ``` 107 | 108 | - Bashでは、たくさんの変数展開の種類があることを覚えておこう。変数が存在するかチェックするなら、`${name:?error message}`。例えば、Bashスクリプトが1つの引数を取る必要があるなら、`input_file=${1:?usage: $0 input_file}`とだけ書けばよい。算術式の展開は、`i=$(( (i + 1) % 5 ))`。シーケンスは`{1..10}`。文字列のトリミングは`${var%suffix}`と`${var#prefix}`。例えば`var=foo.pdf`の時、`echo ${var%.pdf}.txt`とすると`foo.txt`が出力に。 109 | 110 | - コマンドの出力を`<(some command)`のようにしてファイルのように扱える。例えば、ローカルとリモートのの`/etc/hosts`を比較するなら以下のようになる。 111 | 112 | ```sh 113 | diff /etc/hosts <(ssh somehost cat /etc/hosts) 114 | ``` 115 | 116 | - `cat <logfile 2>&1`で標準出力と標準エラー出力の両方をリダイレクトできる。コマンドが標準入力に対してファイルハンドルを開きっぱなしにせず、ログインしているターミナルにひもづけておくため、`; ::Any-NFC; ' < input.txt > output.txt 217 | ``` 218 | 219 | - ファイルを分割するなら`split`(サイズで分割)と`csplit`(パターンで分割)。 220 | 221 | - 圧縮ファイルの操作は`zless`、`zmore`、`zcat`、`zgrep`。 222 | 223 | ## システムのデバッグ 224 | 225 | - Webのデバッグなら`curl`や`curl -l`が便利で、`wget`も同様、よりモダンなのは[`httpie`](https://github.com/jakubroztocil/httpie)。 226 | 227 | - ディスクやCPU、ネットワークのステータスを知るには`iostat`、`netstat`、`top`(あるいは`htop`の方がよい)、(一番は)`dstat`。システムで何が起きているのか素早く知るにはよい。 228 | 229 | - 更に詳しいシステムの全体像を見るには、[`glances`](https://github.com/nicolargo/glances)を使おう。ひとつのターミナル内で、いくつかのシステムレベルの統計情報を表示してくれる。複数のサブシステムを素早くチェックするのに非常に便利。 230 | 231 | - メモリのステータスを知るには、`free`あるいは`vmstat`を実行し、その出力の意味を理解しよう。特に、"cached"の値はLinuxカーネルにファイルキャッシュとして保持されているメモリ量であり、"free"の値を見る際に考慮すべきであることに注意しよう。 232 | 233 | - Javaのシステムのデバッグはまた違う困ったところがあるが、Oracleあるいは他のJVMにも共通しているシンプルなトリックは、`kill -3 `でフルスタックトレースとヒープの概要が標準出力あるいはログにダンプされる(世代別GCの詳細も参考程度だが含まれている)。 234 | 235 | - 改良版tracerouteとして`mtr`を使ってネットワークの問題を調査しよう。 236 | 237 | - ディスクがいっぱいになっている理由を調べるには、`ncdu`を使うと`du -sh *`より時間が節約できる。 238 | 239 | - 帯域を使っているのがどのソケットやプロセスなのかを見つけるには、`iftop`あるいは`nethogs`を試そう。 240 | 241 | - `ab`(Apacheに付属)は、Webサーバのパフォーマンスをざっくりチェックするのに便利。より複雑なテストには`siege`を試そう。 242 | 243 | - より確実なネットワークのデバッグは`wireshark`、`tshark`、`ngrep`。 244 | 245 | - `strace`と`ltrace`について知っておこう。プログラムの実行に失敗したりハングしたりクラッシュしたりして、その理由が分からない、あるいはパフォーマンスに関する一般的情報を知りたいなら、このツールが役立つはずだ。プロファイリングのオプション(`-c`)や起動中のプロセスにアタッチする機能(`-p`)も覚えておこう。 246 | 247 | - 共有ライブラリをチェックするなら`ldd`を覚えておこう。 248 | 249 | - 起動中のプロセスに`gdb`で接続し、そのスタックトレースを取る方法を知ろう。 250 | 251 | - `/proc`以下のファイルを使おう。今起こっている問題をデバッグするのには素晴らしく便利だ。例えば、`/proc/cpuinfo`、`/proc/xxx/cwd`、`/proc/xxx/ece`、`/proc/xxx/fd/`、`/proc/xxx/smaps`。 252 | 253 | - 過去に何か問題が起きたことの原因を探るなら、`sar`がとても便利。CPUやメモリ、ネットワークなどの過去の統計情報を見られる。 254 | 255 | - さらに深いシステムとパフォーマンスの分析には、`stap` ([SystemTap](https://sourceware.org/systemtap/wiki))、[`perf`](http://en.wikipedia.org/wiki/Perf_(Linux))、 256 | [`sysdig`](https://github.com/draios/sysdig)。 257 | 258 | - どのディストリビューションを使っているか確認しよう。多くのディストリビューションでは`lsb_release -a` 259 | 260 | - 何かいつもと違うおかしなこと(大抵ハードウェアかドライバ関連の問題だ)が起きていたら、`dmesg`を実行しよう。 261 | 262 | ## ワンライナー 263 | 264 | コマンドをまとめて使う例をいくつか。 265 | 266 | - `sort`や`uniq`を使ってテキストファイルの共通部分、結合、差異を求める時に特に便利なのが以下のやり方。`a`と`b`はそれぞれ内容に重複のないテキストファイルとする。この方法は高速で、数GB程度までの任意のファイルサイズで動作する(`/tmp`が小さなルートパーティションにある場合は`-T`オプションをつける必要があるが、ソートはメモリ内で行われるとは限らない)。上述の`LC_ALL`と`sort`の`-u`オプションも参照のこと。 267 | 268 | ```sh 269 | cat a b | sort | uniq > c # cはaとbの和集合 270 | cat a b | sort | uniq -d > c # cはaとbの共通部分 271 | cat a b b | sort | uniq -u > c # cはaとbの差異 272 | ``` 273 | 274 | - コンフィグが含まれている`/sys`や`/proc`や`/etc/`のようなディレクトリ内の全てのファイルの中身全部を確認するには`grep . *`を使おう。 275 | 276 | - テキストファイルの3列目を全て足し合わせるには以下で(Pythonで同じことをやるに比べて3倍速く3分の1の長さで書ける)。 277 | 278 | ```sh 279 | awk '{ x += $3 } END { print x }' myfile 280 | ``` 281 | 282 | - ファイルツリーのサイズやデータを確認したいなら、以下は再帰的な`ls -l`と同じだが`ls -lR`より見やすい。 283 | 284 | ```sh 285 | find . -type f -ls 286 | ``` 287 | 288 | - 事情が許すなら`xargs`や`parallel`を使おう。行あたりいくつのアイテムを実行するか(`-L`)や並列度(`-P`)は制御できるのにも注意。正しく使えているか心配な時には、xargs echoをまずやってみよう。また、`-I{}`も便利だ。以下の例をみてみよう。 289 | 290 | ```sh 291 | find . -name '*.py' | xargs grep some_function 292 | cat hosts | xargs -I{} ssh root@{} hostname 293 | ``` 294 | 295 | - Webサーバのログのようなテキストファイルがあり、各行には例えばURLの中に出てくる`acct_id`のような特定の値が現れるとしよう。`acct_id`が何回リクエストされているかを集計するには、 296 | 297 | ```sh 298 | cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn 299 | ``` 300 | 301 | - このドキュメントからランダムに項目を抜き出すには以下の関数を実行しよう(Markdownをパースし、アイテムを抽出する)。 302 | 303 | ```sh 304 | function taocl() { 305 | curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md | 306 | pandoc -f markdown -t html | 307 | xmlstarlet fo --html --dropdtd | 308 | xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" | 309 | xmlstarlet unesc | fmt -80 310 | } 311 | ``` 312 | 313 | ## 目立たないが便利なもの 314 | 315 | - `expr`: 算術演算、論理演算、または正規表現の評価を実行 316 | 317 | - `m4`: シンプルなマクロプロセッサ 318 | 319 | - `yes`: 文字列をたくさん表示 320 | 321 | - `cal`: いい感じのカレンダー 322 | 323 | - `env`: コマンドを実行(スクリプト内で重宝する) 324 | 325 | - `printenv`: 環境変数を表示する(デバッグやスクリプト内での使用に便利) 326 | 327 | - `look`: 文字列で始まる英単語(またはファイル内の行)を見つける 328 | 329 | - `cut `、 `paste`、 `join`: データの操作 330 | 331 | - `fmt`: テキストの段落をフォーマットする 332 | 333 | - `pr`: テキストをページとカラムにフォーマットする 334 | 335 | - `fold`: テキストの行を分割 336 | 337 | - `column`: テキストをカラムあるいはテーブルにフォーマット 338 | 339 | - `expand` と `unexpand`: タブとスペースの相互変換 340 | 341 | - `nl`: 行数を表示 342 | 343 | - `seq`: 数字を表示 344 | 345 | - `bc`: 計算機 346 | 347 | - `factor`: 整数を因数分解 348 | 349 | - `gpg`: 暗号化とファイルのサイニング 350 | 351 | - `toe`: terminfoのエントリのテーブルを表示 352 | 353 | - `nc`: ネットワークのデバッグとデータ転送 354 | 355 | - `socat`: ソケットリレーとTCPポートのフォワーダ(`netcat`と同等) 356 | 357 | - `slurm`: ネットワークトラフィックの可視化 358 | 359 | - `dd`: データをファイルあるいはデバイス間で移動 360 | 361 | - `file`: ファイルの種類を特定 362 | 363 | - `tree`: ディレクトリとサブディレクトリをツリーで表示。`ls`に似ているが再帰的に動く 364 | 365 | - `stat`: ファイルの情報 366 | 367 | - `tac`: ファイルを逆から表示 368 | 369 | - `shuf`: ファイルからランダムに選んだ行を表示 370 | 371 | - `comm`: ソート済みファイルの行を比較 372 | 373 | - `pv`: パイプ経由でデータの進行状況をモニタリング 374 | 375 | - `hd` および `bvi`: バイナリファイルのダンプと編集 376 | 377 | - `strings`: バイナリファイルからテキストを抽出 378 | 379 | - `tr`: 文字の置き換えと操作 380 | 381 | - `iconv` あるいは `uconv`: 文字エンコーディングの変換 382 | 383 | - `split ` と `csplit`: ファイルを分割 384 | 385 | - `units`: 単位の変換と計算。2週間あたりのハロン(訳注 : 長さの単位)からまばたきごとのトゥウィップまで( `/usr/share/units/definitions.units`も参照のこと) 386 | 387 | - `7z`: 圧縮率の高いファイル圧縮 388 | 389 | - `ldd`: 動的ライブラリの情報 390 | 391 | - `nm`: オブジェクトファイルからシンボルを表示 392 | 393 | - `ab`: Webサーバのベンチーマーク 394 | 395 | - `strace`: システムコールのデバッグ 396 | 397 | - `mtr`: ネットワークデバッグのためのより高機能なtraceroute 398 | 399 | - `cssh`: ビジュアルな並列シェル 400 | 401 | - `rsync`: ファイルやフォルダをSSH経由で同期 402 | 403 | - `wireshark` と `tshark`: パケットキャプチャとネットワークデバッギング 404 | 405 | - `ngrep`: ネットワーク層のgrep 406 | 407 | - `host` と `dig`: DNS名前解決 408 | 409 | - `lsof`:プロセスのファイルディスクリプタとソケット情報 410 | 411 | - `dstat`: 便利なシステム情報 412 | 413 | - [`glances`](https://github.com/nicolargo/glances): 高レベルに複数のサブシステムの概要を把握 414 | 415 | - `iostat`: CPUとディスクの使用状況 416 | 417 | - `htop`: topの改良版 418 | 419 | - `last`: ログイン履歴 420 | 421 | - `w`: 誰がログインしているか 422 | 423 | - `id`: ユーザやグループの情報 424 | 425 | - `sar`: システム統計情報の履歴 426 | 427 | - `iftop` または `nethogs`: ソケットあるいはプロセスごとのネットワーク使用量 428 | 429 | - `ss`: ソケットの統計情報 430 | 431 | - `dmesg`: 起動時とシステムのエラーメッセージ 432 | 433 | - `hdparm`: SATA/ATAディスクの操作やパフォーマンス確認 434 | 435 | - `lsb_release`: Linuxディストリビューション情報 436 | 437 | - `lsblk`: ブロックデバイスの一覧。ディスクとディスクパーティションのツリービュー 438 | 439 | - `lshw` と `lspci`: RAIDやグラフィックなどを含めたハードウェア情報 440 | 441 | - `fortune`、 `ddate`、`sl`: んー、あー、これは蒸気機関車やZippyの引用句が「便利」だと思うかどうかによる 442 | 443 | ## さらなるリソース 444 | 445 | - [awesome-shell](https://github.com/alebcay/awesome-shell): シェルのツールやリソースのまとめ 446 | - よりよいシェルスクリプトを書くには[Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/) 447 | 448 | ## 免責事項 449 | 450 | ごく一部の例外はありますが、コードは誰でも読めるように書かれている。力には責任が伴う。Bashで*できる*からといって、そうすべき必要があるという意味ではない! ;) 451 | 452 | ## ライセンス 453 | 454 | [![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) 455 | 456 | このドキュメントは[Creative Commons Attribution-ShareAlike 4.0 International Licene](http://creativecommons.org/licenses/by-sa/4.0/)でライセンスされる。 457 | -------------------------------------------------------------------------------- /README-ko.md: -------------------------------------------------------------------------------- 1 | [ Languages: 2 | [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-cn.md), [繁體中文](README-zh-tw.md) 3 | ] 4 | 5 | 6 | # The Art of Command Line 7 | 8 | [![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) 9 | 10 | - [Meta](#meta) 11 | - [Basics](#basics) 12 | - [Everyday use](#everyday-use) 13 | - [Processing files and data](#processing-files-and-data) 14 | - [System debugging](#system-debugging) 15 | - [One-liners](#one-liners) 16 | - [Obscure but useful](#obscure-but-useful) 17 | - [MacOS X only](#macos-x-only) 18 | - [More resources](#more-resources) 19 | - [Disclaimer](#disclaimer) 20 | 21 | 22 | ![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](cowsay.png) 23 | 24 | 커맨드라인을 능숙하게 다루는것은 도외시되거나 신비스럽게 여겨집니다. 하지만 커맨드라인은 명백하고도 미묘한 방법으로 엔지니어가 하는 작업의 유연성과 생산성을 향상시킵니다. 이 문서는 리눅스에서 작업을 하면서 찾은 노트와 팁들의 모음입니다. 몇 가지는 기초적이고, 몇가지는 상당히 구체적이며, 세련되고, 잘 알려지지 않은 것입니다. 이 문서는 그리 길지 않지만, 여기 있는 모든것을 사용할 수 있게 되고, 기억해낼 수 있게 된다면, 많은 것을 알게되는 것입니다. 25 | 26 | 여기있는 대부분의 것은 27 | [원래](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands) 28 | [Quora에](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix) 29 | [올라온](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know) 것입니다. 30 | 하지만 거기에 관심을 가지기보다, Github를 이용하는 것이 더 가치있는 것처럼 보입니다. 여기엔 더 재능있는 사람들이 손쉽게 개선안을 제안할 수 있는 곳이죠. 만약 문제가 있거나, 더 나아질 수 있는 내용이 보인다면, 이슈를 제출하거나 풀 리퀘스트를 보내주세요! (물론 meta 섹션과 이미 존재하는 풀 리퀘스트와 이슈를 봐주기를 바랍니다.) 31 | 32 | ## Meta 33 | 34 | 범위: 35 | 36 | - 이 가이드는 초보자와 경험자 모두를 위한 것입니다. 목표는 범위(전부 다 중요합니다!), 구체성(대부분의 일반적인 케이스에 대한 구체적인 예제), 그리고 간결함(쉽게 마주치지 않는, 중요하지 않고, 지엽적인 것을 피함) 입니다. 모든 팁은 특정 상황에서 매우 중요하거나, 여러 대안들 사이에서의 시간을 확연하게 절약합니다. 37 | - 이 문서는 리눅스를 위한것입니다. "[MacOS X only](#macos-x-only)"세션을 제외하고 말이죠. 일부는 MacOS에서 똑같이 적용되지 않습니다(Cygwin에서 조차 말이죠). 38 | - 인터랙티브 Bash에 초점이 맞추어져있습니다만, 대부분의 팁은 다른 쉘이나, general Bash 스크립트에서도 동작합니다. 39 | - 이 문서는 "스탠다드" 유닉스 커맨드와 특정 패키지 설치를 필요로 하는 것 둘 다 포함하고 있습니다. 여기서 다루는 스탠다드 커맨드와 특정 패키지에 대한 것은 포함될만큼 충분히 중요합니다. 40 | 41 | 노트: 42 | 43 | - 이 문서를 한 파일로 유지하기 위해서, 컨텐츠들은 암시적인 레퍼런스 형태로 포함되어있습니다. 한 개념이나 명령어에 대해 알게 된 후에, 다른곳에서 그에대한 좀 더 자세한 정보를 찾을 수 있을만큼 당신은 똑똑할것입니다. `apt-get`, `yum`, `dnf`, `pacman`, `pip`, `brew` (혹은 적절한 다른 것)을 이용해 새 프로그램을 설치하세요. 44 | - [Explainshell](http://explainshell.com/)을 이용해서 각각의 커맨드, 옵션, 파이프나 그 외 등등이 어떤것인지 알아보십시오. 45 | 46 | 47 | ## Basics 48 | 49 | - 기본 Bash를 배우세요. 말하자면, 최소한 `man bash`를 실행하고, 전부를 훑어 보세요. 매뉴얼의 내용은 따라가기 쉬우며 그리 길지 않습니다. 다른 쉘들 또한 좋습니다만, Bash는 강력하고 언제나 사용가능합니다( *오직* zsh, fish, 그 외의 쉘만을 당신의 노트북에서 시도하면서 배우는 경우에는, 많은 경우 제한이 생길것입니다. 이미 존재하는 서버를 사용하는 것등의 일에서 말이죠). 50 | 51 | - 텍스트 기반 에디터를 최소한 하나정도 다룰 수 있게 배우세요. Vim(`Vi`)가 이상적입니다. 터미널에서 온갖 작업을 하는데 다른 실질적인 경쟁자가 없기 때문이죠(Emacs, 대형 IDE 또는 모던 힙스터스러운 에디터를 대부분의 작업에 사용한다고 해도 말이죠). 52 | 53 | - `man`을 이용해서 문서를 읽는 법을 배우세요(호기심 많은 사람을 위해서 하는 얘기입니다만, `man man`은 섹션 번호들의 목록을 표시합니다. 예를 들어 1은 "regular" 커맨드, 5는 files/conventions, 그리고 8은 administration이죠). `apropos`를 히용해서 man 페이지를 찾으세요. 몇몇 커맨드는 실행가능한 커맨드가 아니라는 것을 알아두세요. 하지만 Bash 빌트인 함수들은 `help`와 `help -d`를 이용해서 도움말을 볼 수 있습니다. 54 | 55 | - `>`와 `<`, `|`를 이용한 파이프를 사용해서 입력과 출력의 리다이렉션을 배우세요. `>`는 출력 파일을 덮어 씌우고, `>>`는 덧붙이는걸 알아두세요. stdout(역주: 표준 출력)과 stderr(역주: 표준 에러 출력)에 대해서 배우세요. 56 | 57 | - `*`(그리고 아마도 `?`과 `{`...`}`)을 이용하는 파일 글롭(glob) 확장을 배우세요. 그리고 쌍따옴표`"`와 홑따옴표`'`의 차이를 배우세요. (변수 확장에 대해서 더 보려면 아래를 참조하세요) 58 | 59 | - Bash 작업 관리에 익숙해지세요. `&`, **ctrl-z**, **ctrl-c**, `jobs`, `fg`, `bg`, `kill` 등등. 60 | 61 | - `ssh`를 배우고, `ssh-agent`, `ssh-add`를 통해서 비밀번호 없는 인증 방식의 기본을 배우세요. 62 | 63 | - 기본 파일 관리: `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`. 64 | 65 | - 기본 네트워크 관리: `ip` 또는 `ifconfig`, `dig`. 66 | 67 | - 정규표현식(regular expression)을 잘 알아두세요. 그리고 `grep`/`egrep`의 다양한 플래그도 알아두세요. `-i`, `-o`, `-v`,`-A`, `-B`와 `-C` 옵션은 알아둘 가치가 있습니다. 68 | 69 | - `apt-get`, `yum`, `dnf` 또는 `pacman`을 이용하여 패키지를 찾고 설치하는 법을 배우세요. 그리고 `pip`가 설치되어있는지 확인해서, 파이선 기반의 커맨드 라인 도구를 설치할 수 있도록 하세요(밑에 설명된 것중 몇가지는 `pip`를 이용해 설치하는게 제일 쉽습니다. 70 | 71 | 72 | ## Everyday use 73 | 74 | - Bash 에서 **Tab**을 쓰면 argument를 완성하고, **ctrl-r**을 쓰면 커맨드 히스토리에서 검색합니다. 75 | 76 | - Bash에서 **ctrl-w**는 마지막 단어를 지웁니다. **ctrl-u**는 라인의 처음까지 전부다 지웁니다. **alt-b**와 **alt-f**를 이용해서 단어 단위로 이동할 수 있습니다. **ctrl-a**로 라인의 시작점으로 이동할 수 있고 **ctrl-e**로 라인의 끝으로 이동할 수 있습니다. **ctrl-k**는 커서 위치부터 라인의 끝까지 지웁니다. **ctrl-l**은 화면을 깨끗하게 합니다. `man readline`을 이용해서 Bash의 기본 키 조합을 살펴보세요. 많은 것이 있습니다. 예를 들면 **alt-.**같은 경우, 이건 argument를 돌아가면서 나타내고 **alt-***는 글롭을 확장합니다. 77 | 78 | - vi 스타일의 키 조합을 사랑한다면, `set -o vi`를 사용할수도 있습니다. 79 | 80 | - 최근 사용한 커맨드를 보려면 `history`를 입력하세요. `!$`(마지막 argument), `!!`(마지막 커맨드)와 같은 약어들이 매우 많습니다. 비록 이런 것들이 **ctrl-r**이나 **alt-.**명령어로 자주 대체되기 쉽지만요. 81 | 82 | - 이전에 작업하던 디렉토리로 돌아가려면 `cd -`를 사용하세요. 83 | 84 | - 커맨드를 타이핑 하던 도중에 마음이 바뀌었다면, **alt-#**을 쳐서 시작점에 `#`을 삽입하고, 엔터를 쳐서 코멘트로 여겨지게 하세요(또는 **ctrl-a**, **#**, **enter**). 나중에 커맨드 히스토리에서 찾아서 타이핑 중이었던 커맨드로 돌아올 수 있습니다. 85 | 86 | - `xargs`(혹은 `parallel`)를 사용하세요. 매우 강력합니다. 라인당 몇개의 아이템이 실행되게 할 것인지(`-L`) 그걸 병렬로 할 것인지(`-P`)를 제어할 수 있다는걸 기억하세요. 제대로 하고있는지 확신할 수 없다면 `xargs echo`를 먼저 실행해보세요. 또 `-I{}`도 간편합니다. 예시: 87 | ```bash 88 | find . -name '*.py' | xargs grep some_function 89 | cat hosts | xargs -I{} ssh root@{} hostname 90 | ``` 91 | 92 | - `pstree -p`는 프로세스 트리를 표시하는데 도움이 됩니다. 93 | 94 | - `pgrep`과 `pkill`을 사용해서 프로세스를 찾거나 시그널을 보내세요(`-f`가 유용합니다). 95 | 96 | - 프로세스에 보낼 수 있는 다양한 시그널을 알아두세요. 예를 들어, 프로세스를 일시중지 할 때는 `kill -STOP [pid]`를 사용합니다. 전체 목록은 `man 7 signal`에서 볼 수 있습니다. 97 | 98 | - 백그라운드 프로세스를 영원히 돌아가게 만들고 싶다면, `nohup`이나 `disown`을 사용하세요. 99 | 100 | - 어떤 프로세스가 리스닝(역주: 특정 포트로 들어오는 패킷 리스닝)을 하고 있는지 알려면 `netstat -lntp`나 `ss -plat`을 사용해서 알 수 있습니다(TCP일 경우입니다. UDP의 경우 `-u`옵션을 추가하세요). 101 | 102 | - `lsof`를 이용해서 열려있는 소켓과 파일을 볼 수 있습니다. 103 | 104 | - Bash 스크립트에서 `set -x`를 사용하면 디버깅용 출력을 사용하게 됩니다. 스트릭트 모드(strict mode)가 가능할때면 사용하세요. `set -e`를 사용하면 에러가 났을때 중단시키게됩니다. `set -o pipefail`을 사용하면 에러에 대해서 강경한 기준을 적용합니다(이 주제가 조금 미묘하지만 말이죠). 더 복잡한 스크립트의 경우 `trap`또한 사용합니다. 105 | 106 | - `uptime`이나 `w`를 이용해서 시스템이 얼마나 오래 실행중인지 알 수 있습니다. 107 | 108 | - 자주 사용되는 커맨드에 대해서 `alias`를 이용해서 숏컷을 만드세요. 예를들어, `alias ll='las -latr'`은 새 단축명령 `ll`을 만듭니다. 109 | 110 | - Bash 스크립트에서 (괄호로 둘러쌓여 작성된) 서브쉘은 커맨드를 그룹으로 묶는 편리한 방법입니다. 일반적인 예로, 임시로 다른 디렉토리로 이동하여 작업하는 것이 있습니다. 111 | ```bash 112 | # do something in current dir 113 | (cd /some/other/dir && other-command) 114 | # continue in original dir 115 | ``` 116 | 117 | - 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`를 출력합니다. 118 | 119 | - 커맨드의 실행 결과 출력물은 `<(some command)`처럼 이용해서 파일처럼 다뤄질 수 있습니다. 예를들어 로컬의 `/etc/hosts`를 리모트의 것과 비교하려면 다음처럼 하면 됩니다. 120 | ```sh 121 | diff /etc/hosts <(ssh somehost cat /etc/hosts) 122 | ``` 123 | 124 | - `cat << EOF...`같은 "here documents"에 대해서 알아두세요. 125 | 126 | - Bash에서 표준 출력(standard output)과 표준 에러(standard error) 둘 다 `some-command > logfile 2>&1`같은 명령어로 리다이렉트할 수 있습니다. 종종, 커맨드가 열린 파일 핸들을 남기지 않는 것을 확실히 하기 위해, 현재 작업중인 터미널에서 명령어에 ` foo: 201 | rename 's/\.bak$//' *.bak 202 | # Full rename of filenames, directories, and contents foo -> bar: 203 | repren --full --preserve-case --from foo --to bar . 204 | ``` 205 | 206 | `shuf`를 사용해서 파일안의 임의의 행을 선택하거나, 섞을 수 있습니다. 207 | 208 | - `sort`의 옵션들을 알아두세요. `-n`은 숫자를 정렬할 때, `-h`는 사람이 읽을 수 있게 작성한 숫자의 경우(`du -h`와 같은 형태). 키가 어떻게 작동하는지 알아두세요(`-t`와 `-k`). 특별히, 첫번째 필드로만 정렬해야 한다면 `-k1,1`을 적어야 한다는걸 주의하세요. `-k1`은 모든 행에 대해서 정렬하라는 뜻입니다. 안정적인 정렬(`sort -s`)도 유용합니다. 예를들어, 먼저 2번 필드로 정렬하고, 그 다음에 1번 필드로 정렬할 경우, `sort -k1,1 | sort -s -k2,2`처럼 할 수 있습니다. 209 | 210 | - 만약 탭(tab)문자를 Bash 커맨드 라인에 사용해야 할 필요가 생길 경우(예를 들면 -t argument를 이용해 정렬 할 때), **ctrl-v** **[Tab]**키를 누르거나, `$'\t'`를 쓰세요(문자쪽이 복사나 붙여넣기를 할 수 있어 더 낫습니다.). 211 | 212 | - 소스코드를 패치하는 기본 도구는 `diff`와 `patch`입니다. diff의 통계 요약을 보려면 `diffstat`를 보세요. `diff -r`은 모든 디렉토리에 대해 작업을 수행하는걸 알아두세요. `diff -r tree1 tree2 | diffstat`으로 변경 내역의 요약을 볼 수 있습니다. 213 | 214 | - 바이너리 파일을 간단하게 hex 덤프를 뜨고 싶을 때는 `hd`를 쓰세요. 바이너리 파일을 수정할때는 `bvi`를 사용하세요. 215 | 216 | - `strings` (그리고 `grep`, 등) 을 사용해서 바이너리 파일 안에서 문자열 비트를 찾을 수 있습니다. 217 | 218 | - 바이너리 파일을 diff하려면(델타 압축), `xdelta3`를 사용하세요. 219 | 220 | - 텍스트 파일 인코딩을 변경하려면 `iconv`를 시도해보세요. 또는 `uconv`는 더 복잡한 목적에 사용할 수 있습니다. `uconv`는 몇가지 복잡한 유니코드를 지원합니다. 예를들어, 소문자화하고 모든 악센트를 제거하는(확장하고, 떨어트리는 것을 이용해서) 커맨드는 다음과 같습니다. 221 | ```sh 222 | uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt 223 | ``` 224 | 225 | - 파일을 여러 조각으로 나누려면 `split`(파일을 사이즈로 나눔)이나 `csplit`(파일을 패턴으로 나눔)을 보세요. 226 | 227 | - `zless`, `zmore`, `zcat` 그리고`zgrep`을 이용해서 압축된 파일에 대해 작업하세요. 228 | 229 | 230 | ## System debugging 231 | 232 | - 웹 디버깅을 위해서는 `curl` 와 `curl -I` 가 도움이 되고, `wget`도 꽤 도움이 됩니다. 그외에 보다 현대적인 방식으로는 [`httpie`](https://github.com/jakubroztocil/httpie)이 있습니다. 233 | 234 | - 디스크/cpu/네트워크의 상태를 알기 위해서는 각각 `iostat`, `netstat`, `top` (혹은 더 나은 명령어인 `htop`), 그리고 특히 `dstat`을 사용하세요. 시스템에 어떠한일이 일어났는지를 빠르게 알아내는데 매우 좋습니다. 235 | 236 | - 보다 시스템의 심층적인 면들을 보려면 [`glances`](https://github.com/nicolargo/glances)를 사용해보세요. 이 커맨드는 한 터미널에서 여러 시스템 수준의 통계자료들을 보여줍니다. 빠르게 여러 서브시스템들을 체크하는데 매우 큰 도움이 될 것입니다. 237 | 238 | - 메모리의 상태를 알아보려면 `free` 와 `vmstat`를 실행하고 그 결과를 해석해보세요. 특히, "cached" 값은 Linux kernel에 의해 file cache로 잡혀있는 메모리 라는 것을 알고 있어야 하고 그래서 "free"값에 대해서 보다 효율적으로 계산할 수 있습니다. 239 | 240 | - Java 시스템의 디버깅은 조금 다른상황입니다. 하지만 Oracle과 그 외의 회사에서 만든 다른 JVM들에서는 `kill -3 `를 실행하면 전체 stack trace정보와 heap의 정보(시기별로 가비지 콜렉터의 세부적인 내용같은 매우 유용한 정보)를 요약하여 stderr나 로그로 출력해주므로 간단하게 정보를 얻어올 수 있습니다. JDK의 `jps`, `jstat`, `jstack`, `jmap` 명령은 유용합니다. [SJK tools](https://github.com/aragozin/jvm-tools)은 더 고급 정보를 다룰 수 있습니다. 241 | 242 | - 네트워크 이슈들을 알아보기 위해서는 traceroute를 사용할수도 있지만 이보다 더 좋은 `mtr`를 사용하세요. 243 | 244 | - 디스크가 왜 가득찼는지 알아보기 위해서 `ncdu`를 사용해보세요. 일반적으로 사용하는 `du -sh *`와 같은 커멘드를 사용하는 것보다는 시간을 줄일 수 있습니다. 245 | 246 | - 어떠한 소켓이나 프로세스가 사용하는 대역폭(bandwidth)를 찾아보려면 `iftop`나 `nethogs`를 사용하세요. 247 | 248 | - `ab`라는 툴(Apache에 딸려있는)은 신속하고 간단하게(quick-and-dirty) 웹서버의 성능을 체크하는데 유용합니다. 보다 복잡한 부하 테스트를 할때는 `siege`를 사용해보세요. 249 | 250 | - 보다 심각한 경우의 네트워크 디버깅을 위해서는 `wireshark`, `tshark` 또는 `ngrep`를 사용하세요. 251 | 252 | - `strace` 와 `ltrace`에 대해서 알아보세요. 이 커맨드들은 만일 어떤 프로그램에서 failing, hanging 혹은 crashing이 일어나거나 그 외에 여러분이 무슨이유인지 알지 못하는 상황이나 성능에 대한 대략적인 내용을 얻고자 할때 유용할 것입니다. 특히 프로파일링을 위한 옵션(`-c`)과 현재 실행중인 프로세스에 붙이기 위한 옵션(`-p`)을 기억하세요. 253 | 254 | - 공유 라이브러리(shared libraries) 등을 체크하기 위해서는 `ldd`에 대해 알아보세요. 255 | 256 | - `gdb`를 가지고 현재 실행중인 프로세스에 연결하고 그 프로세스의 stack trace들을 얻는 방법을 알아보세요. 257 | 258 | - `/proc`를 사용하세요. 이것은 현재 발생하고 있는 문제를 디버깅할때 종종 놀랍도록 큰 도움이 될것입니다. 예시:`/proc/cpuinfo`, `/proc/meminfo`, `/proc/cmdline`, `/proc/xxx/cwd`, `/proc/xxx/exe`, `/proc/xxx/fd/`, `/proc/xxx/smaps` (`xxx`는 프로세스 id나 pid입니다). 259 | 260 | - 과거에 왜 무엇인가가 잘못되었는지를 디버깅할때에는 `sar`가 매우 유용할 것입니다. 이 커맨드는 CPU, memory, network 등의 통계 내역을 보여줍니다. 261 | 262 | - 시스템의 보다 깊은곳을 보거나 퍼포먼스를 분석하기 위해서는, `stap` ([SystemTap](https://sourceware.org/systemtap/wiki)),나 [`perf`](http://en.wikipedia.org/wiki/Perf_(Linux)), 그리고 [`sysdig`](https://github.com/draios/sysdig)를 사용해보세요. 263 | 264 | - 여러분이 사용하는 Linux의 배포판이 무엇인지 확인(대부분의 배포판에서 작동합니다)하려면 `uname`이나 `uname -a` 또는 `lsb_release -a`를 사용하세요. 265 | 266 | - 언제든지 무언가가 정말로 재미있는 반응을 보인다면 `dmesg`를 사용해보세요 (아마도 하드웨어나 드라이버의 문제일 것입니다). 267 | 268 | 269 | ## One-liners 270 | 271 | 커맨드들을 한데 묶어서 사용하는 예제들 272 | 273 | - `sort`/`uniq`를 사용하여 텍스트 파일의 교차점, 조합, 차이점을 확인이 필요할때 상당한 도움이 될겁니다. 가령 `a`와 `b`가 유일한 값들만을 가진 텍스트 파일이라합시다. 이것이 임의의 크기인 파일을(그게 기가바이트라고 해도) 빠르게 작업할 수 있습니다. (Sort는 메모리 제한에 걸리지 않습니다만, 만약 루트 파티션이 작은 경우, `/tmp`를 사용하기위해 `-T`옵션을 사용하면됩니다.) 위의 `LC_ALL`에대한 내용은 `sort`의 `-u`옵션을 확인하십시오. (아래 예제에 집중하기 위해서 생략) 274 | ```sh 275 | cat a b | sort | uniq > c # c is a union b 276 | cat a b | sort | uniq -d > c # c is a intersect b 277 | cat a b b | sort | uniq -u > c # c is set difference a - b 278 | ``` 279 | 280 | - `grep . *`을 사용해서 디렉토리 안의 모든 파일을 비주얼하게 살펴 볼 수 있습니다. 예를들어 `/sys`, `/proc`, `/etc` 같이 설정 값들로 가득한 디렉토리에 말이죠. 281 | 282 | - 텍스트 파일의 세번째 열의 숫자들의 모든 값을 더하는 것은 이렇게 합니다. 이 방법은 같은 일을 하는 파이썬 코드보다 3배정도 빠르고, 1/3정도의 길이밖에 안됩니다. 283 | ```sh 284 | awk '{ x += $3 } END { print x }' myfile 285 | ``` 286 | 287 | - 파일 트리에서 크기와 날짜를 보려면 이렇게 하세요. 이 명령어는 `ls -l`을 재귀적으로 수행하는 것과 같지만, `ls -lR`보다 더 읽기 쉽습니다. 288 | ```sh 289 | find . -type f -ls 290 | ``` 291 | 292 | - 웹서버 로그같은 텍스트 파일이 있다고 합시다. 그리고 URL 파라메터에 나타나는 `acct_id`같은 특정 값이 몇몇 행에 나타난다고 해보죠. 각각의 `acct_id`에 대해 얼마나 많은 요청이 있었는지 알고 싶다면 다음처럼 할 수 있습니다. 293 | ```sh 294 | cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn 295 | ``` 296 | 297 | - 다음 함수를 실행하면 이 문서에 있는 팁 중 임의의 것을 얻을 수 있습니다(마크다운을 파싱하고 항목을 추출합니다). 298 | ```sh 299 | function taocl() { 300 | curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md | 301 | pandoc -f markdown -t html | 302 | xmlstarlet fo --html --dropdtd | 303 | xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" | 304 | xmlstarlet unesc | fmt -80 305 | } 306 | ``` 307 | 308 | 309 | 310 | 311 | ## Obscure but useful 312 | 313 | - `expr`: 산술적이거나 논리적인 작업을 수행하거나 정규표현식을 검증할때 사용합니다 314 | 315 | - `m4`: 간단한 메크로 수행기를 실행합니다 316 | 317 | - `yes`: 어떠한 한 문장을 매우 많이 출력합니다 318 | 319 | - `cal`: 간단한 달력을 보여줍니다 320 | 321 | - `env`: 어떤 한 커맨드를 실행합니다(스크립트를 만들때 유용합니다) 322 | 323 | - `printenv`: 환경 변수들을 출력합니다(디버깅을 할때나 스크립트를 만들때 유용합니다) 324 | 325 | - `look`: 어떤 문자열로 시작하는 영단어(혹은 파일의 어떤 한 줄)을 찾습니다 326 | 327 | - `cut `, `paste` 그리고 `join`: 데이터를 수정할때 사용합니다 328 | 329 | - `fmt`: 문단의 서식을 지정합니다 330 | 331 | - `pr`: 문서의 페이지나 컬럼 서식을 지정합니다 332 | 333 | - `fold`: 문서의 각 라인들을 특정한 길이에 맞게 수정합니다 334 | 335 | - `column`: 문서의 컬럼이나 테이블의 서식을 지정합니다 336 | 337 | - `expand` and `unexpand`: 탭을 공백으로 바꾸어주거나 공백을 탭으로 바꾸어줍니다 338 | 339 | - `nl`: 줄 번호를 추가해줍니다 340 | 341 | - `seq`: 숫자들을 출력하는데 사용합니다 342 | 343 | - `bc`: 간단한 계산기를 실행합니다 344 | 345 | - `factor`: 정수들을 인수분해하는데 사용합니다 346 | 347 | - [`gpg`](https://gnupg.org/): 파일들을 암호화하고 서명하는데 사용합니다 348 | 349 | - `toe`: terminfo 엔트리들의 테이블(table of terminfo entries) 350 | 351 | - `nc`: 네트워크를 디버깅하거나 데이터를 전송할때 사용합니다 352 | 353 | - `socat`: 소켓 릴레이나 TCP 포트로 내용을 전달할때 사용합니다(`netcat`과 비슷합니다) 354 | 355 | - [`slurm`](https://github.com/mattthias/slurm): 네트워크 상황을 시각화하여 보여줍니다 356 | 357 | - `dd`: 파일들이나 디바이스들 간에 데이터를 옮길때 사용합니다 358 | 359 | - `file`: 파일의 종류를 알아내는데 사용합니다 360 | 361 | - `tree`: 디렉토리들과 그 하위 디렉토리를 마치 ls를 반복적으로 입력한 것처럼 트리의 형태로 보여줍니다 362 | 363 | - `stat`: 파일의 정보를 보여줍니다 364 | 365 | - `time`: execute and time a command 366 | 367 | - `tac`: 파일의 내용을 역순으로 출력합니다 368 | 369 | - `shuf`: 파일의 각 줄들을 임의의 순서로 출력합니다 370 | 371 | - `comm`: 정렬된 파일들을 각 라인별로 비교합니다 372 | 373 | - `pv`: 파이프를 통해서 프로세스의 정보를 모니터링하는데 사용합니다 374 | 375 | - `hd` and `bvi`: 바이너리 파일을 수정하거나 덤프를 얻어오는데 사용합니다 376 | 377 | - `strings`: 바이너리 파일들에서 특정 문장을 추출하는데 사용합니다 378 | 379 | - `tr`: 문자를 변환하거나 조작하는데 사용합니다 380 | 381 | - `iconv` or `uconv`: 문서의 인코딩방식을 변환하는데 사용합니다 382 | 383 | - `split `and `csplit`: 파일들을 쪼개는데 사용합니다 384 | 385 | - `sponge`: 쓰기 전에 모든 입력을 읽습니다. 같은 파일에서 읽은 후에 쓰기에 유용합니다. 예를 들면 `grep -v something some-file | sponge some-file`처럼 사용할 수 있습니다. 386 | 387 | - `units`: 단위를 변환하거나 계산하는데 사용합니다 예를들어 furlongs/fortnight 단위를 twips/blink로 변환합니다 (`/usr/share/units/definitions.units`를 참고하세요) 388 | 389 | - `7z`: 고효율의 파일 압축프로그램입니다 390 | 391 | - `ldd`: 동적 라이브러리들의 정보를 보여줍니다 392 | 393 | - `nm`: 오브젝트 파일들에 포함된 심볼정보를 얻어옵니다 394 | 395 | - `ab`: 웹 서버를 벤치 마킹하는데 사용합니다 396 | 397 | - `strace`: 시스템 콜을 디버깅할때 사용합니다 398 | 399 | - `mtr`: 네트워크 디버깅시에 traceroute보다 더 낫습니다 400 | 401 | - `cssh`: 쉘을 동시에 여러개 사용할때 사용합니다 402 | 403 | - `rsync`: SSH를 이용해 원격 파일 시스템이나, 로컬 파일시스템의 파일과 폴더들을 동기화 할때 사용합니다 404 | 405 | - `wireshark` and `tshark`: 패킷정보를 가져오며 네트워킹을 디버깅하는데 사용합니다 406 | 407 | - `ngrep`: 네트워크 환경에서 grep과 같은 역할을 합니다 408 | 409 | - `host` and `dig`: DNS 정보를 보여줍니다 410 | 411 | - `lsof`: 프로세스 파일 디스크립터와 소켓의 정보를 보여줍니다 412 | 413 | - `dstat`: 유용한 시스템 정보를 보여줍니다 414 | 415 | - [`glances`](https://github.com/nicolargo/glances): 보다 고차원의 여러 서브시스템들의 정보를 한번에 보여줍니다 416 | 417 | - `iostat`: 디스크의 사용량 정보를 보여줍니다 418 | 419 | - `mpstat`: CPU 사용량 정보를 보여줍니다. 420 | 421 | - `vmstat`: 메모리 사용량 정보를 보여줍니다. 422 | 423 | - `htop`: 보다 개선된 형태의 top을 보여줍니다 424 | 425 | - `last`: 로그인 했던 정보들을 보여줍니다 426 | 427 | - `w`: 현재 누가 로그인했는지 보여줍니다 428 | 429 | - `id`: 현재 유저나 그룹에 대한 식별 정보를 보여줍니다 430 | 431 | - `sar`: 시스템 상태에 대한 정보를 보여줍니다 432 | 433 | - `iftop` or `nethogs`: 소켓 또는 프로세스를 이용하여 네트워크를 정보를 보여줍니다 434 | 435 | - `ss`: 소켓에 관한 통계자료들을 보여줍니다 436 | 437 | - `dmesg`: 부팅 메시지와 시스템 에러 메시지들을 보여줍니다 438 | 439 | - `hdparm`: SATA/ATA disk들의 정보를 수정하거나 그것들이 작동하도록 합니다. 440 | 441 | - `lsb_release`: Linux 배포판의 정보를 보여줍니다 442 | 443 | - `lsblk`: 블록 디바이스들의 목록을 보여줍니다 : 여러분의 디스크들이나 디스크파티션들을 트리의 형태로 보여줍니다 444 | 445 | - `lshw`, `lscpu`, `lspci`, `lsusb`, `dmidecode`: CPU, BIOS, RAID, graphics, devices 등의 하드웨어 정보를 보여줍니다 446 | 447 | - `lsmod`와 `modifno`: 커널 모듈의 상세정보를 목록으로 보여줍니다. 448 | 449 | - `fortune`, `ddate`, 그리고 `sl`: 에... 증기기관차를 생각하고있고 그것을 인용하고 싶다면 이것은 "유용"합니다 450 | 451 | 452 | ## MacOS X only 453 | 454 | *MacOS에서만* 해당되는 항목입니다. 455 | 456 | - `brew` (Homebrew)나 `port` (MacPorts)를 패키지 메니저로 사용합니다. 보다 많은 명령어를 MacOS에 설치하여 사용할 수 있습니다. 457 | 458 | - `pbcopy`를 이용하여 데스크탑 어플리케이션에 명령어 출력물을 복사하거나 `pbpaste`를 이용해 붙여넣기를 할 수 있습니다. 459 | 460 | - 데스크탑 어플리케이션에서 파일을 열기위해, `open` 또는 `open -a /Applications/Whatever.app`을 사용하면 됩니다. 461 | 462 | - Spotlight: `mdfind`를 이용해 파일을 찾고, `mdls`를 이용해 메타데이타 (사진 EXIF 정보와 같은) 목록을 볼 수 있습니다. 463 | 464 | - 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`과 같은)나 테스트시 주의해야합니다. 465 | 466 | 467 | ## More resources 468 | 469 | - [awesome-shell](https://github.com/alebcay/awesome-shell): 쉘에 대한 툴과 리소스들이 잘 정리되어 있는 리스트입니다. 470 | - [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/): 보다 나은 쉘스크립트를 작성하기 위한 정보글입니다. 471 | 472 | 473 | ## Disclaimer 474 | 475 | 매우 작은 작업을 제외한 코드들은 다른 사람이 읽을 수 있도록 작성됩니다. 그러니 이 내용은 작성자 전원에게 책임이 있습니다. Bash에서 뭔가를 *할 수 있다는* 것이 당신이 뭔가를 해야된다는 것을 강요하는 것이 아니다! ;) 476 | 477 | 478 | ## License 479 | 480 | [![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) 481 | 482 | 이 저작물은 [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/)에 따라 이용할 수 있습니다. 483 | -------------------------------------------------------------------------------- /README-pt.md: -------------------------------------------------------------------------------- 1 | [ Languages: 2 | [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-cn.md), [繁體中文](README-zh-tw.md) 3 | ] 4 | 5 | 6 | # A arte da linha de comando 7 | 8 | - [Meta](#meta) 9 | - [Básico](#básico) 10 | - [Uso diário](#uso-diário) 11 | - [Processamento de arquivos e dados](#processamento-de-arquivos-e-dados) 12 | - [Debugando o sistema](#debugs-do-sistema) 13 | - [One-liners](#one-liners) 14 | - [Obscuros mas úteis](#obscuros-mas-úteis) 15 | - [Mais conteúdo](#mais-conteúdo) 16 | - [Aviso](#aviso) 17 | 18 | 19 | ![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](cowsay.png) 20 | 21 | Fluência na linha de comando é uma habilidade muitas vezes negligenciada ou considerada obsoleta, porém ela aumenta sua flexibilidade e produtividade como *desenvolvedor* de diversas maneiras, sutis ou não. Este texto descreve uma seleção de notas e dicas de uso da linha de comando que me parecem muito uteis, quando usando o Linux. Algumas dicas são elementares, e outras são mais específicas, sofisticadas ou obscuras. Esta página é curta, mas se você souber usar e lembrar todos os items que estão aqui, então você está mandando bem. 22 | 23 | Muito do que está aqui [originalmente](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands) 24 | [apareceu](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix) 25 | no [Quora](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know), 26 | mas dado o interesse por lá, me pareceu importante usar o Github, onde pessoas mais talentosas do que eu, poderiam sugerir melhorias facilmente. Se você descobrir um erro ou algo que poderia ser melhorado, por favor abra um issue ou um PR! (E claro, por favor veja as `meta sections' e PRs/issues existentes, primeiro.) 27 | 28 | ## Meta 29 | 30 | Escopo: 31 | 32 | - Este guia é destinado tanto aos iniciantes quanto aos usuários mais experientes. Os objetivos são *abrangencia* (tudo que é importante), *especificidade* (dar exemplos concretos dos casos de usos mais comuns), e *brevidade* (evitar coisas que não são tão essenciais ou digressões que você pode facilmente encontrar pela internet). Todas as dicas são essenciais em alguma situação ou trazem uma economia notável de tempo em relação a outras alternativas. 33 | - Este guia é escrito para o Linux. Muitos, mas não todos os items, se aplicam igualmente para o MacOS (ou mesmo o Cygwin). 34 | - O foco está na interatividade com Bash, embora muitas dicas aqui sejam aplicáveis a outras `shells' e tambem a scripts em Bash, em geral. 35 | - Incluimos tanto comandos no Unix "padrão", quanto comandos que requeiram instalação de pacotes adicionais -- desde que estes sejam importantes o suficiente para merecerem sua inclusão nessa lista. 36 | 37 | Notas: 38 | 39 | - Para manter este guia em uma única página, o conteúdo implícito será incluído por referência. Você é competente o suficiente para verificar mais detalhes em outros lugares, desde que você já tenha entendido a ideia ou saiba o que procurar no Google. Use `apt-get`/`yum`/`dnf`/`pacman`/`pip`/`brew` (quando adequado) para instalar novos programas. 40 | - Use [Explainshell](http://explainshell.com/) para encontrar informações úteis sobre o que fazem os comandos, as opções, pipes e etc. 41 | 42 | 43 | ## Básico 44 | 45 | - Aprenda o básico sobre Bash. Na verdade, digite `man bash` e pelo menos entenda superficialmente o seu funcionamento; é bastante simples de ler e nem é tão grande assim. Shells alternativas podem ser legais, mas Bash é a mais poderosa e sempre está disponível (aprender *somente* zsh, fish, etc, é tentador quando você usa o seu próprio notebook, mas restringe você em muitas situações, por exemplo quando você quer usar servidores de outros). 46 | 47 | - Aprenda bem pelo menos um editor de text tradicional. Idealmente o Vim (`vi`), já que nenhum outro funciona tão bem nos terminais aleatórios que a gente encontra por ai (mesmo que você prefira usar o Emacs, um IDE, ou um editor hipster a maior parte do tempo). 48 | 49 | - Saiba como ler a documentação com o `man` (para os curiosos, `man man` lista os números das seções, por exemplo, 1 se refere aos comandos "regulares", 5 é sobre arquivos/convenções, e 8 diz respeito a administração). Procure outros documentos do manual com o `apropos`. Saiba que alguns dos comandos não são executáveis, mas sim built-ins(embutidos) no bash, pra esses você poderá conseguir ajuda com `help` e `help -d`. 50 | 51 | - Aprenda como fazer redirecionamento de saída e entrada usando `>` e `<` e pipes usando `|`. Aprenda sobre o stdout e stdin. 52 | 53 | - Aprenda sobre a expansão de arquivos glob com `*` ( e talvez `?` e `{`...`}`) e entenda as diferenças entre aspas duplas `"` e aspas simples `'`. (Veja mais em variáveis de expansão abaixo.) 54 | 55 | - Se familiarize com o gerenciamento de jobs em Bash: `&`, **ctrl-z**, **ctrl-c**, `jobs`, `fg`, `bg`, `kill`, etc. 56 | 57 | - Aprenda `ssh`, e o básico de autenticação sem senha, através do `ssh-agent`, `ssh-add`, etc. 58 | 59 | - Gerenciamento básico de arquivos: `ls` e `ls -l` (em particular, aprenda o que cada coluna no `ls -l` significa), `less`, `head`, `tail` e `tail -f` (ou melhor ainda, `less +F`), `ln` e `ln -s`(aprenda as diferenças e vantagens de soft links comparados a hard links), `chown`, `chmod`, `du` (para um rápido resumo do uso do disco: `du -sk *`). Para gerenciamento do sistema de arquivos, `df`, `mount`, `fdisk`, `mkfs`, `lsblk`. 60 | 61 | - Gerenciamento básico da rede: `ip` ou `ifconfig`, `dig`. 62 | 63 | - Saiba bem como usar expressões regulares, e as várias flags para `grep`/`egrep`. As `-i`, `-o`, `-A`, e `-B` são opções que é importante conhecer. 64 | 65 | - Aprenda a usar `apt-get`, `yum`, `dnf` ou `pacman` (dependendo da distribuição) para procurar e instalar pacotes. E garanta que você possui o `pip` para instalar ferramentas baseadas em Python (algumas das abaixo são mais fáceis de instalar através do `pip`). 66 | 67 | 68 | ## Uso diário 69 | 70 | - Usando Bash, use **Tab** para completar argumentos e **ctrl-r** para pesquisar através a história dos comandos. 71 | 72 | - Em Bash, utilize **ctrl-w** para deletar a última palavra, e **ctrl-u** para deletar tudo e voltar para o início da linha. Use **alt-b** e **alt-f** para se mover por palavras, **ctrl-k** para apagar até o final da linha, **ctrl-l** para limpar a tela. Consulte `man readline` para todos os keybindings padrões do Bash. Existem muitos. Por exemplo **alt-.** circula através dos argumentos anteriores, e **alt-*** expande um glob. 73 | 74 | - Alternativamente, se você adora os keybinds do vi, use `set -o vi`. 75 | 76 | - Para ver os comandos recentes, `history`. Existem também muitas abreviações como `!$` (último argumento) e `!!` último comando, embora estes sejam muitas vezes facilmente substituídos por **ctrl-r** e **alt-.**. 77 | 78 | - Pra voltar para o diretório anterior de trabalho: `cd -`. 79 | 80 | - Se você está na metade do caminho ao digitar um comando, mas mudou de ideia, tecle **alt-#** para adicionar um `#` ao início da linha e definir esta como um comentário (ou use **ctrl-a**. **#**. **enter**). Mais tarde você poderá recuperar o comando através da `history`. 81 | 82 | - Use `xargs` (ou `parallel`). Estes são muito poderosos. Note que você pode controlar como os vários items são executados por linha (`-L`) assim como o paralelismo (`-P`). Se você não tem certeza se isto é a coisa certa a se fazer, use `xargs echo` primeiro. O `-I{}` também é muito útil. Exemplos: 83 | ```bash 84 | find . -name '*.py' | xargs grep some_function 85 | cat hosts | xargs -I{} ssh root@{} hostname 86 | ``` 87 | 88 | - `pstree -p` é um modo de visualização muito útil da árvore de processos. 89 | 90 | - Use `pgrep` e `pkill` para procurar ou sinalizar os processo pelo seu nome (`-f` é muito útil). 91 | 92 | - Saiba os vários sinais que você pode enviar para um processo. Por exemplo, para suspender um processo, use `kill -STOP [pid]`. Para saber a lista completas dos sinais, veja `man 7 signal`. 93 | 94 | - Use `nohup` ou `disown` se você deseja por o processo no background, executando para sempre. 95 | 96 | - Verifique quais processos estão escutando através de `netstat -lntp` ou `ss -plat` (para TCP; adicione `-u` para UDP). 97 | 98 | - Veja também `lsof` para abrir sockets e arquivos. 99 | 100 | - Em scripts Bash, use `set -x` para debugar a saída. Utilize modos estritos sempre que for possível. Use `set -e` para abortar em caso de erros. Use `set -o pipefail` para também ser restrito a respeito dos erros (embora este tópico seja um pouco sútil). Para scripts mais desenvolvidos, use também `trap`. 101 | 102 | - Em Bash scripts, subshells (escrito com parênteses) são formas convenientes de agrupar comandos. Um exemplo comum é temporariamente se mover para um diretório de trabalho diferente, e.g. 103 | ```bash 104 | # faz algo no diretório corrente 105 | (cd /some/other/dir && other-command) 106 | # continua no diretório atual 107 | ``` 108 | 109 | - No Bash, note que existem muitos tipos de variáveis de expansão. Verificando a existência de uma variável: `${name:?error_messages}`. Por exemplo, se um script Bash requer um único argumento, apenas escreva `input_file=${1:?usage: $0 input_file}`. Expansões aritméticas: `i=$(( (i + 1) % 5 ))`. Sequências: `{1..10}`. Aparando as strings: `${var%suffix}` e `${var#prefix}`. Por exemplo, se `var=foo.pdf`, então `echo ${var%.pdf}.txt` imprime `foo.txt`. 110 | 111 | - A saída de um comando pode ser tratada como um arquivo através `<(algum comando)`. Por exemplo, comparar um arquivo local `/etc/hosts` com um remoto: 112 | ```sh 113 | diff /etc/hosts <(ssh somehost cat /etc/hosts) 114 | ``` 115 | 116 | - Saiba sobre "documentos aqui" no Bash, como em `cat <logfile 2> $1`. Muitas vezes, para garantir que um comando não deixa um arquivo aberto para manipular a entrada padrão, digitando isso no terminal que você está, é uma boa prática adicionar um ` foo: 190 | rename 's/\.bak$//' *.bak 191 | # Renomea completamente o nome dos arquivos, diretórios, e outros conteúdos foo -> bar: 192 | repren --full --preserve-case --from foo --to bar . 193 | ``` 194 | 195 | - Utilize o `shuf` para embaralhar ou selecionar linhas randoms de um arquivo. 196 | 197 | - Para as opções do `sort`. Aprenda com as chaves (`-t` e `-k`). Em particular, saiba que precisa escrever `-k1,1` para ordenar somente o primeiro campo; `-k1` significa ordenar de acordo com a linha inteira. 198 | 199 | - Ordenação estável (`sort -s`) pode ser útil. Por exemplo, para ordenar primeiramente pelo campo 2, então secundariamente pelo campo 1, você pode usar `sort -k1,1 | sort -s -k2,2`. 200 | 201 | - Se você precisa escrever literalmente um tab na linha de comando no Bash (por exemplo, para o argumento -t do `sort`), pressione **ctrl-v** **[Tab]** ou escreva `$'\t'` (o último é melhor pois você pode copiar e colar ele). 202 | 203 | - As ferramentas padrão para extrair patches de códigos fonte são `diff`e `patch`. Veja também `diffstat` para um resumo de estatísticas de um diff. Note que `diff -r` funciona para diretórios inteiros. Use `diff -r tree1 tree2 | diffstat` para um resumo das alterações. 204 | 205 | - Para arquivos binários, use `hd` para um simples dump hexadecimal e `bvi` para edição binária. 206 | 207 | - Também para arquivos binários, `strings` (mais `grep`, etc.) deixa você encontrar pedaços de texto. 208 | 209 | - Para diffs binários (compressão delta), use `xdelta3.` 210 | 211 | - Para converter a codificação de textos, tente `iconv`. Ou `uconv` para uso mais avançado; Este suporta algumas funcionalidades avançadas do Unicode. Por exemplo, este comando transforma o texto para minúsculo e remove todos os acentos (expandindo e removendo eles): 212 | ```sh 213 | uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt 214 | ``` 215 | 216 | - Para dividir um arquivo em pedaços, veja `split` (para dividir por tamanho) e `csplit` (para dividir por um padrão). 217 | 218 | Use `zsless`, `zmore`, `zcat`, and `zgrep` para manipular arquivos comprimidos. 219 | 220 | 221 | ## Debugando o sistema 222 | 223 | - Para web debug, `curl` e `curl -I` são úteis, ou os equivalentes `wget`, or uma alternativa mais moderna [`httpie`](https://github.com/jakubroztocil/httpie). 224 | 225 | - Para saber o status do disco/cpu/rede, use `iostat`, `netstat`, `top` (ou o `htop` como alternativa melhor), e (especialmente) `dstat`. Bom para obter uma ideia rápida do que está acontecendo em um sistema. 226 | 227 | - Para um resumo mais aprofundado do sistema, use [`glances`](https://github.com/nicolargo/glances). Este lhe apresenta vários níveis de estatísticas do sistema em uma janela do terminal. Muito útil para uma rápida verificação em vários subsistemas. 228 | 229 | - Para saber o status da memória, execute e entenda a saída do `free` `vmstat`. Em particular, esteja ciente de que o valor "cached", é mantido pelo kernel Linux como um arquivo de cache, então este efetivamente conta como um valor de memória disponível. 230 | 231 | - Debugar um sistema java é uma outra historia, mas um simples truque nas máquinas virtuais Oracle ou algum outro tipo de JVM é que você pode executar `kill -3 ` e um completo rastreamento da pilha(stack trace) e resumo do heap (incluindo detalhes geracionais do garbage collector, os quais podem ser altamente informativos) serão vazados para stderr/logs. 232 | 233 | - Use `mtr` como uma melhor alternativa ao traceroute, para identificar problemas na rede. 234 | 235 | - Para verificar o porque de um disco estar cheio, `ncdu` economiza bastante tempo em comparação aos comandos usuais como `du -sh *`. 236 | 237 | - Para procurar qual socket ou processo está utilizando a banda de rede, tente `iftop` ou `nethogs`. 238 | 239 | - A ferramenta `ab` (que vem com o Apache) é muito útil para verificação rápida da performance do servidor web. Para mais complexos testes de carga, tente `siege`. 240 | 241 | - Para debugs mais sérios da rede, `wireshark`, `tshark`, ou `ngrep`. 242 | 243 | - Aprenda a respeito do `strace`e `ltrace`. Estes podem ser úteis se um programa está falhando, travado, ou quebrando, e você não sabe o por que, ou se você quer obter uma ideia geral da performance. Note que a opção de perfil (`-c`), e a habilidade de se plugar a um processo em execução (`-p`). 244 | 245 | - Aprenda a respeito do `ldd` para verificar bibliotecas compartilhadas, e etc. 246 | 247 | - Aprenda sobre como se conectar a um processo em execução com o `gdb` e obter informações sobre a stack trace. 248 | 249 | - Utilize `/proc`. Este é incrivelmente útil em algumas vezes quando se deseja debugar problemas ao vivo. Exemplos: `/proc/cpuinfo`, `/proc/xxx/cwd`, `/proc/xxx/exe`, `/proc/xxx/fd/`, `/proc/xxx/smaps`. 250 | 251 | - Quando estiver debugando o porque de algo ter dado errado no passado, `sar` pode ser de muita utilidade. Ele exibe as estatísticas históricas da CPU, memória, rede e etc. 252 | 253 | - Para análises de performance mais profundas do sistema, dê uma olhada em `stap` ([SystemTap](https://sourceware.org/systemtap/wiki)), [`perf`](http://en.wikipedia.org/wiki/Perf_(Linux)), e [`sysdig`](https://github.com/draios/sysdig). 254 | 255 | - Confirme qual a sua distribuição do Linux usando (funciona na maioria das distros): `lsb_release -a`. 256 | 257 | - Use `dmesg` sempre que algo estiver agindo de maneira estranha (isto pode ser um problema de hardware ou problema de driver). 258 | 259 | 260 | ## One-liners 261 | 262 | Alguns exemplos de como reunir os comandos. 263 | 264 | - O seguinte é notavelmente e frequentemente útil: muitas vezes você quer obter a interseção, união e a diferença de arquivos de texto através de `sort`/`uniq`. Suponha que `a` e `b` são arquivos de texto que são "uniqued" únicos. Esse modo é rápido, e funciona em arquivos de tamanhos arbitrários, podem até possuírem gigabytes. (Sorting não é limitado por memória, embora você possa precisar usar a opção `-T` se `/tmp` está em uma partição pequena.) Veja também a nota sobre `LC_ALL` acima e as opções `-u` do `sort`(vamos deixar isso claro abaixo). 265 | ```sh 266 | cat a b | sort | uniq > c # c is a union b 267 | cat a b | sort | uniq -d > c # c is a intersect b 268 | cat a b b | sort | uniq -u > c # c is set difference a - b 269 | ``` 270 | 271 | - Use `grep . *` para visualmente examinar todo o conteúdo de todos os arquivos de um diretório, por exemplo, para diretórios com arquivos de configurações, como `/sys`, `/proc`, `/etc`. 272 | 273 | 274 | - Somar todos os números em uma terceira coluna de um arquivo de texto (isto é provavelmente 3X mais rápido e 3X menos linhas de código do que o equivalente em Python). 275 | ```sh 276 | awk '{ x += $3 } END { print x }' myfile 277 | ``` 278 | 279 | - Se você quer visualizar tamanhos/datas em uma árvore de arquivos, isto é como um `ls -l` recursivo, mas é mais fácil de ler do que `ls -lR`: 280 | ```sh 281 | find . -type f -ls 282 | ``` 283 | 284 | - Utilize `xargs` ou `parallel` sempre que você puder. Note que você pode controlar quantos item é executado por linha (`-L`) assim como o paralelismo (`-P`). Se você não tem certeza de que esta é a coisa certa a se fazer, utilize `xargs echo` primeiro. 285 | ```sh 286 | find . -name '*.py' | xargs grep some_function 287 | cat hosts | xargs -I{} ssh root@{} hostname 288 | ``` 289 | 290 | - Digamos que você tenha um arquivo de texto, como um log do servidor web, e um certo valor que aparece em algumas linhas, como por exemplo o parâmetro `acct_id` que está presente na URL. Se você quer um cálculo de quantas requisições para este `acct_id`. 291 | ```sh 292 | cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn 293 | ``` 294 | 295 | - Execute esta função para obter uma dica random deste documento (analisa a sintaxe Markdown e extrai um item) 296 | ```sh 297 | function taocl() { 298 | curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README-pt.md | 299 | pandoc -f markdown -t html | 300 | xmlstarlet fo --html --dropdtd | 301 | xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" | 302 | xmlstarlet unesc | fmt -80 303 | } 304 | ``` 305 | 306 | 307 | ## Obscuros mas úteis 308 | 309 | - `expr`: executa operações boleanas ou aritméticas ou avalia expressões regulares. 310 | 311 | - `m4`: simples processador de macros. 312 | 313 | - `yes`: imprime uma string muitas vezes. 314 | 315 | - `cal`: calendário legal. 316 | 317 | - `env`: executa um comando (útil em scripts). 318 | 319 | - `printenv`: imprime as variáveis de ambiente (útil em debug e scripts). 320 | 321 | - `look`: procura palavras inglesas (ou linhas em um arquivo) começando com uma string. 322 | 323 | - `cut ` e `paste` e `join`: manipulação de dados. 324 | 325 | - `fmt`: formata parágrafos de texto. 326 | 327 | - `pr`: formata textos em páginas/colunas. 328 | 329 | - `fold`: envolve linhas de texto. 330 | 331 | - `column`: formata texto em colunas ou tabelas. 332 | 333 | - `expand` e `unexpand`: converte entre tabs e espaços. 334 | 335 | - `nl`: adiciona números as linhas. 336 | 337 | - `seq`: imprime números. 338 | 339 | - `bc`: calculadora. 340 | 341 | - `factor`: fatora inteiros. 342 | 343 | - `gpg`: criptografa e assina arquivos. 344 | 345 | - `toe`: tabela de entradas dos tipos de terminais. 346 | 347 | - `nc`: ferramenta de debug de rede e transferência de dados. 348 | 349 | - `socat`: socket relay e encaminhamento de portas tcp (similar ao `netcat`) 350 | 351 | - `slurm`: visualização do tráfego da rede. 352 | 353 | - `dd`: move os dados entre arquivos ou dispositivos. 354 | 355 | - `file`: identifica o tipo do arquivo. 356 | 357 | - `tree`: mostra os diretórios e subdiretórios como um árvore de dependências; como `ls` mas recursivo. 358 | 359 | - `stat`: informações do arquivo. 360 | 361 | - `tac`: imprime arquivos na ordem reversa. 362 | 363 | - `shuf`: seleção random de linhas de um arquivo. 364 | 365 | - `comm`: compara uma lista de arquivos ordenadas linha por linha. 366 | 367 | - `pv`: monitora o progresso dos dados através de um pipe. 368 | 369 | - `hd` e `bvi`: dump ou edita arquivos binários. 370 | 371 | - `strings`: extrai texto de arquivos binários. 372 | 373 | - `tr`: tradução e manipulação de caracteres. 374 | 375 | - `iconv` ou `uconv`: conversor de codificações de texto. 376 | 377 | - `split ` e `csplit`: divisão de arquivos. 378 | 379 | - `units`: conversor de unidades e cálculos; converte furlongs por quinzena para twips per blink (veja também `/usr/share/units/definitions.units`) 380 | 381 | - `7z`: Compressor de arquivos de alto desempenho. 382 | 383 | - `ldd`: informações dinâmicas das bibliotecas. 384 | 385 | - `nm`: símbolos de arquivos objetos. 386 | 387 | - `ab`: benchmarking para web servers. 388 | 389 | - `strace`: Debug para chamadas de sistema. 390 | 391 | - `mtr`: melhor traceroute para debugar a rede. 392 | 393 | - `cssh`: Visualização concorrente da shell. 394 | 395 | - `rsync`: Sincroniza arquivos e pastas através do SSH. 396 | 397 | - `wireshark` e `tshark`: captura de pacotes e debug de rede. 398 | 399 | - `ngrep`: grep para a camada de rede. 400 | 401 | - `host` e `dig`: Consultas DNS. 402 | 403 | - `lsof`: Arquivo de descritores dos processos e informações dos sockets. 404 | 405 | - `dstat`: Estatísticas úteis do sistema. 406 | 407 | - [`glances`](https://github.com/nicolargo/glances): Resumo de alto nível, de multi subsistemas. 408 | 409 | - `iostat`: Estatísticas de uso do CPU e do disco. 410 | 411 | - `htop`: Versão do top melhorada. 412 | 413 | - `last`: histórico de logins. 414 | 415 | - `w`: quem está logado. 416 | 417 | - `id`: Informações sobre a identidade do user/group. 418 | 419 | - `sar`: histórico dos estados do sistema. 420 | 421 | - `iftop` ou `nethogs`: Utilização da rede por sockets ou processos. 422 | 423 | - `ss`: Estatísticas dos sockets. 424 | 425 | - `dmesg`: Mensagens de erro do sistema e do boot. 426 | 427 | - `hdparm`: Manipulação/performance de discos SATA/ATA. 428 | 429 | - `lsb_release`: Informações sobre a distribuição do Linux. 430 | 431 | - `lsblk`: Lista os blocos dos dispositivos: uma visualização em forma de árvore dos seus discos e partições do disco. 432 | 433 | - `lshw` e `lspci`: informações do hardware, incluindo RAID, gráficos, etc. 434 | 435 | - `fortune`, `ddate`, e `sl`: um, bem, isto depende de você considerar locomotivas a vapor e citações Zippy "úteis". 436 | 437 | ## Mais conteúdo 438 | 439 | - [awesome-shell](https://github.com/alebcay/awesome-shell): Uma lista refinada de ferramentas da shell e outros recursos. 440 | - [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/) para escrever shell scripts melhores. 441 | 442 | ## Aviso 443 | 444 | Com a exceção de tarefas muito pequenas, código é normalmente escrito para que outros possam ler. Junto com o poder vem a responsabilidade. O fato de você *poder* fazer algo usando Bash não significa necessariamente que você deve! ;) 445 | 446 | 447 | ## Licença 448 | 449 | [![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) 450 | 451 | Este trabalho está licenciado com uma [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/). 452 | -------------------------------------------------------------------------------- /README-ru.md: -------------------------------------------------------------------------------- 1 | [ Languages: 2 | [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-cn.md), [繁體中文](README-zh-tw.md) 3 | ] 4 | 5 | 6 | # Искусство командной строки 7 | 8 | [![Вступайте в англоязычный чат проекта 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) 9 | 10 | - [Описание](#Описание) 11 | - [Основы](#Основы) 12 | - [Ежедневное использование](#Ежедневное-использование) 13 | - [Процессинг файлов и информации](#Процессинг-файлов-и-информации) 14 | - [Системный дебаггинг](#Системный-дебаггинг) 15 | - [В одну строчку](#В-одну-строчку) 16 | - [Сложно, но полезно](#Сложно-но-полезно) 17 | - [MacOS X only](#macos-x-only) 18 | - [Больше информации по теме](#Больше-информации-по-теме) 19 | - [Дисклеймер](#Дисклеймер) 20 | 21 | 22 | ![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](cowsay.png) 23 | 24 | Продвинутому использованию командной строки зачастую не уделяют достаточного внимания. О терминале говорят, как о чем-то мистическом. На самом же деле, это умение очевидно (и не очевидно) увеличивает Вашу продуктивность в работе. Данный документ является подборкой заметок и советов, которые я нашел для себя полезными, работая с командной строкой в Linux. Некоторые из их них – простые и очевидные, но некоторые - довольно сложные. И предназначены для решения конкретных задач. Это небольшая публикация, но если Вы уже знаете обо всем, что тут написано, и можете вспомнить, как это все использовать – вы много знаете! 25 | 26 | Многое из того, что тут написано, [изначально](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands) 27 | [появилось](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix) 28 | на [Quora](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know), 29 | начав идею там, похоже, что стоит развить ее на Github, где обитают люди, которые талантливее меня и могут предлагать улучшения данной подборки. Если Вы заметили ошибки (во всех вариантах перевода), пожалуйста оставьте тикет или киньте пулл-реквест (заранее изучив описание и посмотрев на уже созданнные тикеты и пулл-реквесты). 30 | 31 | ## Описание 32 | 33 | Основное: 34 | 35 | - Данная публикация предназначена как для новичков, так и для опытных людей. Цели: *объемность* (собрать все важные аспекты использования командной строки), *практичность* (давать конкретные примеры для самых частых юзкейсов) и *краткость* (не стоит углубляться в неочевидные вещи, о которых можно почитать в другом месте). 36 | - Этот документ написан для пользователей Linux, с единственным исключеним – секцией "[MacOS only](#macos-only)". Все остальное подходит и может быть установлено под все UNIX/MacOS системы (и даже Cygwin). 37 | - Фокусируемся на интерактивном Баше, но многие вещи также могут быть использованы с другими шеллами; и в общем применимы к Баш-скриптингу. 38 | - Эта инструкция включает в себя стандартные Unix команды и те, для которых нужно устанавливать сторонние пакеты. Они настолько полезны, что стоят того, чтобы их установили. 39 | 40 | Заметки: 41 | 42 | - Для того, чтобы руководство оставалось одностраничным, вся информация вставлена прямо сюда. Вы достаточно умные для того, чтобы самостоятельно изучить вопрос более детально в другом месте. Используйте `apt-get`/`yum`/`dnf`/`pacman`/`pip`/`brew` (в зависимости от вашей системы управления пакетами) для установки новых программ. 43 | 44 | - На [Explainshell](http://explainshell.com/) можно найти простое и подробное объяснение того, что такое команды, флаги, пайпы и т.д. 45 | 46 | ## Основы 47 | 48 | - Выучите основы Баша. Просто возьмите и напечатайте `man bash` в терминале и хотя бы просмотрите его; он довольно просто читается и он не очень большой. Другие шеллы тоже могут быть хороши, но Баш – мощная программа, и Баш всегда под рукой (использование *исключительно* zsh, fish и т.д., которые наверняка круто выглядят на Вашем ноуте во многом Вас ограничивает, например Вы не сможете использовать возможности этих шеллов на уже существующем сервере). 49 | 50 | - Выучите как использовать хотя бы один консольный редактор текста. Идеально Vim (`vi`), ведь у него нет конкурентов, когда вам нужно быстренько что-то подправить (даже если Вы постоянно сидите на Emacs/какой-нибудь тяжелой IDE или на каком-нибудь модном хипстерском редакторе) 51 | 52 | - Знайте как читать документацию через `man` (для любознательных – `man man`; `man` по углам документа в скобках добавляет номер, например 1 – для обычных команд, 5 – для файлов, конвенций, 8 – для административных команд). Ищите мануалы через `apropos`, и помните, что некоторые команды – не бинарники, а встроенные команды Баша, и помощь по ним можно получить через `help` и `help -d`. 53 | 54 | - Узнайте о том, как перенаправлять ввод и вывод через `>` и `<` и пайпы `|`. Помните, что `>` – переписывает выходной файл, а `>>` добавляет к нему. Узнайте побольше про stdout и stderr. 55 | 56 | - Узнайте побольше про раскрытие file glob элементов `*` (а также `?` и `{`...`}`), кавычки, а также разницу между двойными `"` и одинарными `'` кавычками. (Больше о расширении переменных читайте ниже.) 57 | 58 | - Будьте знакомы с работой с процессами в Bash: `&`, **ctrl-z**, **ctrl-c**, `jobs`, `fg`, `bg`, `kill`, и т.д. 59 | 60 | - Знайте `ssh` и основы беспарольной аутентификации через `ssh-agent`, `ssh-add`, и т.д. 61 | 62 | - Основы работы с файлами: `ls` и `ls -l` (в частности, узнайте, что значит каждый столбец в `ls -l`), `less`, `head`, `tail` и `tail -f` (или даже лучше – `less +F`), `ln` и `ln -s` (узнайте разницу между символьными ссылками и жёсткими ссылками, и почему жёсткие ссылки лучше), `chown`, `chmod`, `du` (для быстрой сводки по использованию диска: `du -hk *`). Для менеджмента файловой системы, `df`, `mount`, `fdisk`, `mkfs`, `lsblk`. 63 | 64 | - Основы работы с сетью: `ip` или `ifconfig`, `dig`. 65 | 66 | - Хорошо знайте регулярные выражения и разные флаги к `grep`/`egrep`. Такие флаги как `-i`, `-o`, `-A`, и `-B` стоит знать. 67 | 68 | - Обучитесь использованию системами управления пакетами `apt-get`, `yum`, `dnf` или `pacman` (в зависимости от дистрибутива). Знайте как искать и устанавливать пакеты и обязательно имейте установленым `pip` для установки командных утилит, написаных на Python (некоторые из тех, что вы найдёте ниже, легче всего установить через `pip`). 69 | 70 | ## Ежедневное использование 71 | 72 | - Используйте таб в Баше для автокомплита аргументов к командам и **ctrl-r** для поиска по истории командной строки. 73 | 74 | - Используйте **ctrl-w** в Баше для того, чтобы удалить последнее слово в команде; **ctrl-u** для того, чтобы удалить команду полностью. Используйте **alt-b** и **alt-f** для того, чтобы бегать между словами команды, **ctrl-k** для того, чтобы прыгнуть к концу строки, **ctrl-l** для того, чтобы очистить экран. Гляньте на `man readline` чтобы узнать о всех шорткатах Баша. Их много! Например, **alt-.** бежит по предыдущим аргументам команды, а **alt-*** расширяет глоб.?? 75 | 76 | - Если Вам нравятся шорткаты vim, сделайте `set -o vi`. 77 | 78 | - Для того, чтобы посмотреть историю, введите `history`. Также существует множество аббревиатур, например `!$` – последний аргумент, `!!` – последняя команда, хотя эти аббревиатуры часто заменяются шорткатами **ctrl-r** и **alt-.**. 79 | 80 | - Для того, чтобы прыгнуть к последней рабочей директории, используйте `cd -` 81 | 82 | - Если Вы написали команду наполовину и вдруг передумали, нажмите **alt-#** для того, чтобы добавить `#` к началу, и отправьте команду, как комментарий. Потом вы сможете вернуться к ней через историю. 83 | 84 | - Не забывайте использовать `xargs` (или `parallel`). Это очень мощная штука. Обратите внимание, что Вы можете контролировать количество команд на каждую строку, а также параллельность. Если Вы не уверены, что делаете что-то правильно, начните с `xargs echo`. Еще `-I{}` – полезная штука. Примеры: 85 | ```bash 86 | find . -name '*.py' | xargs grep some_function 87 | cat hosts | xargs -I{} ssh root@{} hostname 88 | ``` 89 | 90 | - `pstree -p` – полезный тип вывода дерева процессов. 91 | 92 | - Используйте `pgrep` или `pkill` для того, чтобы находить/слать сигналы к процессам по имени (`-f` помогает). 93 | 94 | - Знайте разные сигналы, которые можно слать процессам. Например, чтобы приостановить процесс, используйте `kill -STOP [pid]`. Для полного списка посмотрите `man 7 signal`. 95 | 96 | - Используйте `nohup` или `disown`, чтобы процесс в фоне выполнялся бесконечно. 97 | 98 | - Узнайте, какие процессы слушают порты через `netstat -lntp` или `ss -plat` (для TCP; добавьте `-u` для UDP). 99 | 100 | - Используйте `lsof` для того, чтобы посмотреть открытые сокеты и файлы. 101 | 102 | - Используйте `alias`, чтобы поименовать частоиспользуемые команды. Например, `alias ll='ls -latr'` создаст новое сокращение `ll`. 103 | 104 | - В Баш скриптах используйте `set -x` для того, чтобы дебажить аутпут. Используйте строгие режимы везде, где возможно. Используйте `set -e` для того, чтобы прекращать выполнение при ошибках. Используйте `set -o pipefail` для того, чтобы строго относится к ошибкам (это немного глубокая тема). Для более сложных скриптов также используйте `trap`. 105 | 106 | - В Баш-скриптах подоболочки (subshells) – удобный способ группировать команды. Один из самых распространенных примеров – временно передвинуться в другую рабочую директорию, вот так: 107 | ```bash 108 | # do something in current dir 109 | (cd /some/other/dir && other-command) 110 | # continue in original dir 111 | ``` 112 | 113 | - В Баше много типов пространства переменных. Проверить, существует ли переменная – `${name:?error message}`. Например, если Баш-скрипту нужен всего один аргумент, просто напишите `input_file=${1:?usage: $0 input_file}`. Арифметическая область видимости: `i=$(( (i + 1) % 5 ))`. Последовательности: `{1..10}`. Обрезка строк: `${var%suffix}` и `${var#prefix}`. Например, если `var=foo.pdf` тогда `echo ${var%.pdf}.txt` выведет `foo.txt`. 114 | 115 | - Вывод любой команды можно сохранить в файлоподобный контекст по `<(some command)`. Например, сравнение локального файла `/etc/hosts с удалённым: 116 | ```sh 117 | diff /etc/hosts <(ssh somehost cat /etc/hosts) 118 | ``` 119 | 120 | - Знайте про *heredoc*-синтаксис в Баше, работает он так: `cat <logfile 2>&1`. Зачастую, для того, чтобы убедится, что команда не оставит открытым файл, привязав его к открытому терминалу, считается хорошей практикой добавлять `; ::Any-NFC; ' < input.txt > output.txt 220 | ``` 221 | 222 | - Для того, чтобы разбить файл на куски, используйте `split` (разбивает на куски по размеру), или `csplit` (по шаблону или регулярному выражению). 223 | 224 | - Используйте `zless`, `zmore`, `zcat`, и `zgrep` для работы со сжатыми файлами. 225 | 226 | ## Системный дебаггинг 227 | 228 | - Дле веб-дебаггинга используйте `curl` и `curl -I`, или их альтернативу - `wget`. Также есть более современные альтернативы, например [`httpie`](https://github.com/jakubroztocil/httpie). 229 | 230 | - Чтобы получить информацию о диске/CPU/сети используйте `iostat`, `netstat`, `top` (или лучшую альтернативу `htop`) и особенно `dstat`. Хороший старт для того, чтобы понимать, что происходит в системе. 231 | 232 | - Для более детальной информации используйте [`glances`](https://github.com/nicolargo/glances). Эта программа показывает сразу несколько разных статистик в одном окне терминала. Полезно, когда следите за сразу несколькими системами. 233 | 234 | - Для того, чтобы следить за памятью, научитесь понимать `free` и `vmstat`. В частности, не забывайте, что кешированые значения ("cached" value) – это память, которую держит ядро и эти значения являются частью `free`. 235 | 236 | - Дебаггинг Java – совсем другая рыбка, но некоторые манипуляции над виртуальной машиной Оракла, или любой другой, позволят вам использовать делать `kill -3 ` и трассировать сводки стека и хипа (включая детали работы сборщика мусора, которые бывают очень полезными), и их можно дампнуть в stderr или логи. 237 | 238 | - Используйте `mtr` для лучшей трассировки, чтобы находить проблемы сети. 239 | 240 | - Для того, чтобы узнать, почему диск полностью забит, используйте `ncdu`, это сохраняет время по сравнению с тем же `du -sh *`. 241 | 242 | - Для того, чтобы узнать, какой сокет или процесс использует интернет, используйте `iftop` или `nethogs`. 243 | 244 | - `ab`, которая поставляется вместе с apache, полезна для быстрой и поверхностной проверки производительности веб-сервера. Для более серьезного лоад-тестинга используйте `siege`. 245 | 246 | - Для более серьёзного дебаггинга сетей используйте `wireshark`, `tshark`, и `ngrep`. 247 | 248 | - Знайте про `strace` и `ltrace`. Эти команды могут быть полезны, если программа падает или висит, и вы не знаете почему Или если вы хотите протестировать производительность программы. Не забывайте про возможность дебаггинга (`-c`) и возможность прицепиться к процессу по pid (`-p`). 249 | 250 | - Не забывайте про `ldd` для проверки системных библиотек. 251 | 252 | - Знайте как прицепиться к работающему процессу через `gdb` и получить трассировку стека. 253 | 254 | - Используйте `/proc`. Иногда он невероятно полезен для отладки запущенных программ. Примеры: `/proc/cpuinfo`, `/proc/xxx/cwd`, `/proc/xxx/exe`, `/proc/xxx/fd/`, `/proc/xxx/smaps`. 255 | 256 | - Когда дебажите что-то, что сломалось в прошлом, используйте `sar` – бывает очень полезно. Показывает историю CPU, памяти, сети и т.д. 257 | 258 | - Для анализа более сложных систем и производительности посмотрите на `stap` ([SystemTap](https://sourceware.org/systemtap/wiki)), [`perf`](http://en.wikipedia.org/wiki/Perf_(Linux)), и [`sysdig`](https://github.com/draios/sysdig). 259 | 260 | - Узнайте, какая у вас операционка, через `uname` or `uname -a` (основная Unix-информация/информация о ядре) или `lsb_release -a` (информация о дистрибутиве). 261 | 262 | - Используйте `dmesg`, когда что-то ведет себя совсем странно (например, железо или драйвера). 263 | 264 | ## В одну строчку 265 | 266 | Давайте соберем все вместе и напишем несколько команд: 267 | 268 | - Это довольно круто, что можно найти множественные пересечения файлов, соединить отсортированные файлы и посмотреть разницу в нескольких файлов через `sort`/`uniq`. Это быстрый подход и работает на файлах любого размера (включая многогигабайтные файлы). (Сортировка не ограничена памятью, но возможно вам придется добавить `-T`, если `/tmp` находится на небольшом логическом диске). Еще посмотрите то, что было сказано выше о `LC_ALL`. Флаг сортировки `-u` не используется ниже, чтобы было понятнее: 269 | ```sh 270 | cat a b | sort | uniq > c # c is a union b 271 | cat a b | sort | uniq -d > c # c is a intersect b 272 | cat a b b | sort | uniq -u > c # c is set difference a - b 273 | ``` 274 | 275 | - Используйте `grep . *` для того, чтобы посмотреть содержимое всех файлов в директории. Особенно полезно, когда у вас много конфигов типа `/sys`, `/proc`, `/etc`. 276 | 277 | 278 | - Получить сумму всех чисел, которые находятся в третьей колонке текстового файла. (Скорее всего, это раза в 3 быстрее и раза в 3 проще, чем делать это в Питоне): 279 | ```sh 280 | awk '{ x += $3 } END { print x }' myfile 281 | ``` 282 | 283 | - Если вам нужно посмотреть размеры и даты создания древа файлов используйте: 284 | ```sh 285 | find . -type f -ls 286 | ``` 287 | 288 | Это почти как рекурсивная `ls -l`, но выглядит более читабельно чем `ls -lR`: 289 | 290 | - Используйте `xargs` (или `parallel`). Это очень мощная штука. Обратите внимание, что Вы можете контролировать количество команд на каждую строку, а так же параллельность. Если Вы не уверены, что делаете что-то правильно, начните с `xargs echo`. Еще `-I{}` – полезная штука. Примеры: 291 | ```sh 292 | find . -name '*.py' | xargs grep some_function 293 | cat hosts | xargs -I{} ssh root@{} hostname 294 | ``` 295 | 296 | - Давайте представим, что у нас есть какой-то текстовый файл, например лог какого-то сервера и на каких-то строках появляется значение, строки с которым нам интересны. Например, `acct_id`. Давайте подсчитаем, сколько таких запросов в нашем логе: 297 | ```sh 298 | cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn 299 | ``` 300 | 301 | - Запустите этот скрипт, чтобы получить случайный совет из этой инструкции: 302 | ```sh 303 | function taocl() { 304 | curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md | 305 | pandoc -f markdown -t html | 306 | xmlstarlet fo --html --dropdtd | 307 | xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" | 308 | xmlstarlet unesc | fmt -80 309 | } 310 | ``` 311 | 312 | 313 | ## Сложно, но полезно 314 | 315 | - `expr`: для выполнения арифметических и булевых операций, а также регулярных выражений 316 | 317 | - `m4`: простенький макро-процессор 318 | 319 | - `yes`: вывод строки в бесконечном цикле 320 | 321 | - `cal`: классный календарь 322 | 323 | - `env`: для того, чтобы выполнить команду (полезно в Bash-скриптах) 324 | 325 | - `printenv`: показать переменные окружения (полезно в скриптах или дебаггинге) 326 | 327 | - `look`: найти английские слова (или строки) в файле 328 | 329 | - `cut `, `paste` и `join`: манипуляции с данными 330 | 331 | - `fmt`: форматирование параграфов в тексте 332 | 333 | - `pr`: отформатировать текст в страницы/колонки 334 | 335 | - `fold`: (обернуть) ограничить длину строк в файле 336 | 337 | - `column`: форматировать текст в колонки или таблицы 338 | 339 | - `expand` и `unexpand`: конвертация между табами и пробелами 340 | 341 | - `nl`: добавить номера строк 342 | 343 | - `seq`: вывести последовательность чисел 344 | 345 | - `bc`: калькулятор 346 | 347 | - `factor`: возвести числа в степень 348 | 349 | - `gpg`: зашифровать и подписать файлы 350 | 351 | - `toe`: таблица терминалов terminfo с описанием 352 | 353 | - `nc`: дебаггинг сети и передачи данных 354 | 355 | - `socat`: переключатель сокетов и перенаправление tcp-портов (похоже на `netcat`) 356 | 357 | - `slurm`: визуализация трафика сети 358 | 359 | - `dd`: перенос информации между блочными устройствами 360 | 361 | - `file`: узнать тип файла 362 | 363 | - `tree`: показать директории и поддиректории в виде дерева, как `ls`, но рекурсивно 364 | 365 | - `stat`: информация о файле 366 | 367 | - `tac`: вывести файл посимвольно наоборот ("ласипан") 368 | 369 | - `shuf`: случайная выборка строк из файла 370 | 371 | - `comm`: построчно сравнить отсортированные файлы 372 | 373 | - `pv`: мониторинг прогресса прохождения информации через пайп 374 | 375 | - `hd`, `hexdump`, `xxd`, `biew`: hex-дамп и редактирование бинарников 376 | 377 | - `strings`: найти текст в бинарниках 378 | 379 | - `tr`: манипуляция с char (символьным типом) 380 | 381 | - `iconv` и `uconv`: конвертация кодировок 382 | 383 | - `split` и `csplit`: разбить файлы 384 | 385 | - `sponge`: прочитать весь инпут перед тем, как его записать. Полезно, когда читаешь из того же файла, куда записываешь. Например, вот так: `grep -v something some-file | sponge some-file` 386 | 387 | - `units`: конвертер. Метры в километры, версты в пяди (смотрите `/usr/share/units/definitions.units`) 388 | 389 | - `7z`: архиватор с высокой степенью сжатия 390 | 391 | - `ldd`: показывает зависимости программы от системных библиотек 392 | 393 | - `nm`: получаем названия всех функций, которые определены в .o или .a 394 | 395 | - `ab`: бенчмаркинг веб-серверов 396 | 397 | - `strace`: отладка системных вызовов 398 | 399 | - `mtr`: лучшая трассировка для дебаггинга сети 400 | 401 | - `cssh`: несколько терминалов в одном UI 402 | 403 | - `rsync`: синхронизация файлов и папок через SSH 404 | 405 | - `wireshark` и `tshark`: перехват пакетов и дебаг сети 406 | 407 | - `ngrep`: grep для слоя сети (network layer) 408 | 409 | - `host` и `dig`: узнать DNS 410 | 411 | - `lsof`: процессинг дескрипторов и информация о сокетах 412 | 413 | - `dstat`: полезная статистика ОС 414 | 415 | - [`glances`](https://github.com/nicolargo/glances): высокоуровневая статистика по многим подсистемам 416 | 417 | - `iostat`: статистика процессора и использования жёсткого диска 418 | 419 | - `htop`: улучшенная версия `top` 420 | 421 | - `last`: история логинов в систему 422 | 423 | - `w`: под каким пользователем вы сидите 424 | 425 | - `id`: информация о пользователе/группе 426 | 427 | - `sar`: история системной статистики 428 | 429 | - `iftop` или `nethogs`: использование сети конкретным сокетом или процессом 430 | 431 | - `ss`: статистика сокетов 432 | 433 | - `dmesg`: ошибки загрузки и ошибки системы 434 | 435 | - `hdparm`: манипуляции с SATA/ATA 436 | 437 | - `lsb_release`: информация о дистрибутиве Linux 438 | 439 | - `lsblk`: cписок блочных устройств компьютера: дерево ваших дисков и логических дисков 440 | 441 | - `lshw`, `lscpu`, `lspci`, `lsusb`, `dmidecode`: информация о железе, включая CPU, BIOS, RAID, графику, девайсы, и т.д. 442 | 443 | - `fortune`, `ddate`, и `sl`: хм, не знаю, будут ли вам "полезны" веселые цитатки и поезда, пересекающие ваш терминал :) 444 | 445 | ## MacOS X only 446 | 447 | Некоторые вещи, подходящие *только* для Мака. 448 | 449 | - Системы управлением пакетами – `brew` (Homebrew) и `port` (MacPorts). Они могут быть использованы для того, чтобы установить большинство программ, упомянутых в этом документе. 450 | 451 | - Копируйте выдачу консольных программ в десктопные через `pbcopy` и вставляйте входные данные через `pbpaste`. 452 | 453 | - Для того, чтобы открыть файл или десктопную программу типа Finder, используйте `open`. Вот так: `open -a /Applications/Whatever.app`. 454 | 455 | - Spotlight: Ищите файлы в консоли, через `mdfind`, и смотрите метадату (например EXIF информацию фотографий) через `mdls`. 456 | 457 | - Не забывайте, что MacOS основан на BSD Unix и многие команды (например `ps`, `ls`, `tail`, `awk`, `sed`) имеют небольшие различия с линуксовыми. Это обусловлено влянием `UNIX System V` и `GNU Tools`. Разницу можно заметить, увидев заголовок "BSD General Commands Manual." в манах программ. В некоторых случаях, на Мак можно поставить GNU-версии программ, например `gawk` и `gsed`. Когда пишите кроссплатформенные Bash-скрипты, старайтесь избегать использовать команды, которые могут различаться (например, лучше используйте Python или `perl`), или тщательно все тестируйте. 458 | 459 | ## Больше информации по теме 460 | 461 | - [awesome-shell](https://github.com/alebcay/awesome-shell): Дополняемый список инструментов и ресурсов для командной строки. 462 | - [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/) Для того, чтобы писать шелл-скрипты лучше. 463 | 464 | 465 | ## Дисклеймер 466 | 467 | За небольшим исключением, весь код написан так, чтобы другие его смогли прочитать. 468 | 469 | Кому много дано, с того много и спрашивается. Тот факт, что что-то может быть написано на Баше, вовсе не означает, что оно должно быть на нём написано. ;) 470 | 471 | 472 | ## Лицензия 473 | 474 | [![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) 475 | 476 | Оригинальная работа и перевод на русский язык распространяется под лицензией [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/). 477 | -------------------------------------------------------------------------------- /README-uk.md: -------------------------------------------------------------------------------- 1 | [ Languages: 2 | [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-cn.md), [繁體中文](README-zh-tw.md) 3 | ] 4 | # Мистецтво командного рядка 5 | 6 | [![Вступайте в англомовний чат проекту 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) 7 | 8 | 9 | - [Опис](#Опис) 10 | - [Основи](#Основи) 11 | - [Щоденне використання](#Щоденне-використання) 12 | - [Обробка файлів та інформації](#Обробка-файлів-та-інформації) 13 | - [Дебаггінг](#Дебаггінг) 14 | - [Одним рядком](#Одним-рядком) 15 | - [Складно але корисно](#Складно-але-корисно) 16 | - [MacOS only](#macos-only) 17 | - [Інші джерела](#Інші-джерела) 18 | - [Декламація](#Декламація) 19 | 20 | 21 | ![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](cowsay.png) 22 | 23 | Використанню командного рядка часто не приділяють достатньої уваги. Про термінал говорять, як про щось містичне. Насправді, ці навики явно (і не явно) збільшує Вашу продуктивність в роботі. Даний документ є підбіркою заміток і порад, які я знайшов для себе корисними, працюючи з командним рядком в Linux. Деякі з них - прості й очевидні, але деякі - досить складні та призначені для вирішення конкретних завдань. Це невелика публікація, але якщо Ви вже все це знаєте, що тут написано, і можете згадати як це все використовувати - Ви знаєте багато! 24 | 25 | Ця робота є результатом [багатьох авторів і перекладачів](AUTHORS.md). 26 | Багато з цього [спочатку](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands) [появилось](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix) на [Quora](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know), почавши там, схоже, що варто розмістити і на Github, де знаходяться дуже талановиті люди і можуть допомогти. Якщо Ви замітили помилки (у всіх варіантах перекладу), будь ласка залиште опис [issue](https://github.com/jlevy/the-art-of-command-line/issues) або зробіть Pull requests (Звичайно перевіривши уже існуючі) 27 | 28 | 29 | ## Опис 30 | 31 | Основне: 32 | 33 | - Дана публікація призначена як для недосвідчених, так і для досвідчених користувачів. Цілі: *об'ємість* (зібрати всі важливі аспекти використання командного рядка), *практичність* (надати конкретні приклади для найчастіших задач) та *стислість* (не варто вдаватись у неочевидні речі, про які можна почитати в інших місцях). 34 | - Цей документ написаний для користувачів Linux, із єдиним винятком - розділ "[MacOS only](#macos-only)". Все інше підходить для всі UNIX/MacOS системи (і навіть для Cygwin). 35 | - Сфокусована на інтерактивному Bash, але багато речей також можуть бути використані в інших Шелах; і в застосовні до Bash-скриптів. 36 | - Ця інструкція включає в себе стандартні Unix команди і ті, для яких потрібно встановлювати сторонні пакети. Вони настільки корисні, що варті того, щоб їх встановили. 37 | 38 | Нотатки: 39 | 40 | - Що б все вміщалось на одній сторінці, вся інформація вставлена прямо тут. Ви досить розумні для того, щоб самостійно вивчити питання більш детально в іншому місці. Використовуйте `apt-get`/`yum`/`dnf`/`pacman`/`pip`/`brew` (залежно від вашої системи управління пакетами) для установки нових програм. 41 | - На [Explainshell](http://explainshell.com/) можна знайти просте і докладне пояснення того, що таке команди, їх опції, пайпи(pipes(*|*)) і т.д. 42 | 43 | 44 | ##Основи 45 | 46 | - Вивчіть основи Bash. Просто візьміть і наберіть у командному рядку `man bash` в терміналі і хоча б перегляньте; він досить просто читається і він не дуже великий. Інші шелли теж можуть бути хороші, але Bash - потужна програма, і Bash завжди під рукою (використання *виключно* zsh, fish і т.д., які напевно круто виглядають на Вашому лептопі і ні в чому Вас не обмежують, наприклад Ви не зможете використовувати ці можливості Шеллу на вже існуючому сервері). 47 | - Вивчіть як використовувати хоча б один консольний редактор тексту. Найкраще Vim (`vi`), адже у нього немає конкурентів, коли вам потрібно швиденько щось підправити (навіть якщо Ви постійно сидите у Emacs чи, якомусь важкому IDE або на модному хіпстерському редакторі. 48 | - Знайте, як читати документацію через `man` (`man man`; `man` у кутах документа в дужках додає номер, наприклад 1 - для звичайних команд, 5 - для файлів, 8 - для адміністративних команд). Шукайте інформацію через `apropos`, і пам'ятайте, що деякі команди - не виконувані(executables), а вбудовані команди Bash, і допомогу по них можна отримати через команду `help` і `help -d`. 49 | - Можна перенаправляти введення та виведення через `>` і `<` і пайпи `|`. Пам'ятайте, що `>` - переписує вихідний файл, а `>>` додає до нього. Дізнайтеся побільше про stdout і stderr. 50 | - Дізнайтеся побільше про `*` (а також `?` і `[`...`]`), кавички, а також різницю між подвійними `"` і одинарними `'` кавичками. 51 | - Знайте як працювати із процесами в Bash: `&`, **ctrl-z**, **ctrl-c**, `jobs`, `fg`, `bg`, `kill`, і т.д. 52 | - Знайте `ssh` та основи беспарольної аутентифікації через `ssh-agent`, `ssh-add`, і т.д. 53 | - Основи роботи з файлами: `ls` і `ls -l` (зокрема, дізнайтеся, що значить кожен стовпець в `ls -l`), `less`, `head`,` tail` і `tail -f` (або навіть краще - `less + F`), `ln` і `ln -s` (дізнайтеся різницю між символьними посиланнями і жорсткими посиланнями, і чому жорсткі посилання краще), `chown`, `chmod`, `du` (для отримання швидкої інформації по використанню диска: `du -hk *`). Для менеджменту файлової системи, `df`, `mount`, `fdisk`, `mkfs`, `lsblk`. 54 | - Основи роботи з мережею: `ip` або` ifconfig`, `dig`. 55 | - Добре знайте регулярні вирази і різні опції для `grep`/`egrep`. Такі опції як `-i`, `-o`, `-A`, та `-B` варто знати. 56 | - Навчіться використовувати системами управління пакетами `apt-get`, `yum`, `dnf` та `pacman` (залежно від дистрибутива). Знайте як шукати і встановлювати пакети і обов'язково майте встановленим `pip` для установки командних утиліт, написаних на Python (деякі з тих команд, що ви знайдете нижче, найлегше встановити через` pip`). 57 | 58 | 59 | ##Щоденне-використання 60 | 61 | - Використовуйте клавішу таб в Bash для автодоповнення аргументів до командам та **ctrl-r** для пошуку по історії командного рядка. 62 | - Використовуйте **ctrl-w** в Bash для того, щоб видалити останнє слово в команді; **ctrl-u** для того, щоб видалити команду повністю. Використовуйте **alt-b** і **alt-f** для того, щоб переміщатись між словами у команді, **ctrl-k** для того, щоб перейти в кінця рядка, **ctrl-l** для того, щоб очистити екран. Гляньте на `man readline` щоб дізнатися про всі шорткати Bash. Їх багато! Наприклад, **alt-.** переміщається між попередніми аргументам команди, а **alt-*** максимально розширює аргументи. 63 | - Якщо Вам подобаються шорткати vim, виконайте `set -o vi` (`set -o emacs` що б повернути налаштування). 64 | - Для редагування довгих команд після налаштування вашого консольного редактора (наприклад `export EDITOR=vim`), **ctrl-x** **ctrl-e** відкриє поточну команду в редакторі для багаторядкового редагування команди. Або у vi стилі, **escape-v**. 65 | - Для того, щоб переглянути історію, введіть `history`. Також існує безліч абревіатур, наприклад `! $` - Останній аргумент, `!!` - остання команда, хоча ці абревіатури часто заміняються шорткати **ctrl-r** та **alt-.**. 66 | - Для того, щоб стрибнути до останньої робочої директорії, використовуйте `cd -` 67 | - Якщо Ви написали команду наполовину і раптом передумали, натисніть **alt-#** для того, щоб додати `#` на початок команди, та відправте команду як коментар. Потім ви зможете повернутися до неї через історію команд. 68 | - Використовуйти `xargs` (або` parallel`). Це дуже корисно. Зверніть увагу, що Ви можете контролювати кількість команд на кожен рядок (`-L`) також паралельність (`-P`). Якщо Ви не впевнені, що робите щось правильно, почніть з `xargs echo`. Також `-I{}` - корисно. Приклади: 69 | ```bash 70 | find . -name '*.py' | xargs grep some_function 71 | cat hosts | xargs -I{} ssh root@{} hostname 72 | ``` 73 | - `pstree -p` - допоможе побачити дерево процесів. 74 | - Використовуйте `pgrep` і `pkill` для того, щоб знаходити або слати сигнали до процесів по імені (`-f` корисна опція). 75 | - Знайте різні сигнали, які можна слати процесам. Наприклад, щоб призупинити процес, використовуйте `kill -STOP [pid]`. Для повного списку подивіться `man 7 signal`. 76 | - Використовуйте `nohup` або` disown`, якщо ви хочете запустити фоновий процес що б він постійн виконувався у фоні. 77 | - Дізнайтеся, які процеси слухають порти через `netstat -lntp` або `ss -plat` (для TCP; додайте `-u` для UDP). 78 | - Зверніть увагу на `lsof` щоб подивитися відкриті сокети і файли. 79 | - Команда `uptime` or `w` показує як довго працює система. 80 | - Використовуйте `alias`, щоб створити скорочення для часто використовуємих команд. Наприклад, `alias ll='ls -latr'` створить нове скорочення(alias) `ll`. 81 | - У Bash скриптах використовуйте `set -x` (або `set -v`) щоб дебажити вивід. Використовуйте строгий(strict) режим скрізь, де це можливо. Використовуйте `set -e` для того, щоб припиняти виконання при помилках (не нульовий вихідний код). Використовуйте `set -u` що б визначити невстановленні змінні. Використовуйте `set -o pipefail` щоб при помилках невикористовувати пайпи(вертикальна риска). Для більш складних скриптів також використовуйте `trap` на EXIT or ERR. 82 | Корисний звичка почати використовувати настипний скрипт, який допоможе виявити і перервати на загальних помилоках і вивести повідомлення: 83 | ```bash 84 | set -euo pipefail 85 | trap "echo 'error: Script failed: see failed command above'" ERR 86 | ``` 87 | - У Bash-скриптах підоболочки(subshells) - зручний спосіб групувати команди. Один із найпоширеніших прикладів - тимчасово пересунутися в іншу робочу директорію: 88 | ```bash 89 | # Do something in current dir 90 | (cd / some / other / dir && other-command) 91 | # Continue in original dir 92 | ``` 93 | - У Bash багато типів простору змінних. Перевірити, чи існує змінна - `${name:? Error message}`. Наприклад, якщо Bash-скрипту потрібен всього один аргумент, просто напишіть `input_file=${1:?usage: $0 input_file}`. Арифметична область видимості: `i=$(( (i + 1) % 5 ))`. Послідовності: `{1..10}`. Обрізка рядків: `${var%suffix}` і `${var#prefix}`. Наприклад, якщо `var=foo.pdf` тоді `echo ${var%.pdf}.txt` виведе `foo.txt`. 94 | - Фігурні скобки, використовуючи `{`...`}` може зменшити необхідність повторно вводити той самий текст і автоматизувати. Це корисно в такому прикладі як `mv foo.{txt,pdf} some-dir` (який пересуває обидва файла), `cp somefile{,.bak}` (який розширюється у `cp somefile somefile.bak`) або `mkdir -p test-{a,b,c}/subtest-{1,2,3}` (яка розширює всі можливі комбінації і створює дерево деректорій). 95 | - Вивід будь-якої команди можна обробити як файл наступним чином `<(some command)`. Наприклад, порівняння локального файлу `/etc/hosts з віддаленим: 96 | ```sh 97 | diff /etc/hosts <(ssh somehost cat /etc/hosts) 98 | ``` 99 | - Знайте про *heredoc* -сінтаксис в Bash: `cat << EOF ...`. 100 | - У Bash перенаправляйте стандартні потоки виводу(output) та помилок, ось так: `some-command >logfile 2>&1`. Найчастіше, для того, щоб переконається, що команда не залишить відкритим файл, прив'язавши його до відкритого терміналу, вважається хорошою практикою додавати ` foo: 151 | rename 's/\.bak$//' *.bak 152 | # Full rename of filenames, directories, and contents foo -> bar: 153 | repren --full --preserve-case --from foo --to bar . 154 | ``` 155 | - Як говорить man сторінка, `rsync` дійсно є швидким і універсальним інструментом копіювання файлів, для синхронізації між машинами, але в рівній мірі корисні на локальному рівні. Також [швидке рішення](https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html) що б видалити велику кількість файлів: 156 | ```sh 157 | mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir 158 | ``` 159 | - Використовуйте `shuf`, щоб перемішати або вибрати випадкові рядки з файлу. 160 | - Знайте опції для команди `sort`. Для чисел використовуйте `-n` або `-h`, для роботи з числами (наприклад `du -h`). Знайте як працюють ключі (`-t` і `-k`). Зокрема, не забувайте, що вам потрібно писати `-k1,1` для того, щоб впорядкувати тільки перше поле; `-k1` - це означає сортування враховуючи цілий рядок. Може бути корисною (`sort -s`). Наприклад для того, щоб відсортувати найважливіше по другому полю, а другорядне по першому, можна використовувати `sort -k1,1 | sort -s -k2,2`. 161 | - Якщо вам коли-небудь доведеться написати код символу табуляції в терміналі, наприклад, для сортування за табуляції з прапором -t, використовуйте скорочення **ctrl-v** **[Tab]** або напишіть `$'\t'`. Останнє краще, тому що його можна скопіювати/вставити. 162 | - Стандартні інструменти для виправлення вихідного коду це `diff` і` patch`. Також зверніть увагу на `diffstat` для перегляду статистики diff і `sdiff` для крок за кроком diff. Запамятайте `diff -r` працює рекурсивно по всій директорії. Використовуйте `diff -r tree1 tree2 | diffstat` для повного зведення змін. Використовуйте `vimdiff` порівняти і редагувати файли. 163 | - Для бінарних файлів використовуйте `hd`, `hexdump` або `xxd` для простих hex-дампом, і` bvi` або `biew` для зміни бінарників. 164 | - Також для бінарних файлів, `strings` (plus `grep`, etc.) дозволить Вам знайти біти тексту. 165 | - Щоб подивитися різницю в бінарниках (дельта-кодування): `xdelta3`. 166 | - Для конвертування кодувань використовуйте `iconv`. Для більш складних завдань - `uconv`, він підтримує деякі складні фічі Юникода. Наприклад, ця команда переводить рядки з файлу в нижній регістр і прибирає наголоси (наприклад в іспанській мові) 167 | ```sh 168 | uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt 169 | ``` 170 | - Для того, щоб розбити файл на шматки, використовуйте `split` (розбиває на шматки за розміром), або `csplit` (за шаблоном або по регулярному виразу). 171 | - Для дати і часу використовуйте `dateadd`, `datediff`, `strptime` ще можете знайти на [`dateutils`](http://www.fresse.org/dateutils). 172 | - Використовуйте `zless`,` zmore`, `zcat`, і `zgrep` для роботи зі стиснутими файлами. 173 | 174 | 175 | ##Дебаггінг 176 | 177 | - Дле веб-дебаггінга використовуйте `curl` і `curl -I`, або альтернативу - `wget` або [`httpie`](https://github.com/jakubroztocil/httpie). 178 | - Щоб отримати інформацію про диск/CPU/мережі використовуйте `iostat`,` netstat`, `top` (краще `htop`) і `dstat`. Використовуйте `iostat -mxz 15` для отримання основної інформації CPU. 179 | - Для інформації про мережу використовуйте `netstat` і `ss`. 180 | - Для більш детальної інформації використовуйте [`glances`](https://github.com/nicolargo/glances). Ця програма показує відразу кілька різних статистик в одному вікні терміналу. Корисно, коли стежите за відразу декількома системами. 181 | - Для того, щоб стежити за пам'яттю вокористовуйте `free` і `vmstat`. Зокрема, не забувайте, що значення кешування ("cached" value) - Це пам'ять, яку тримає ядро і ці значення є частиною `free`. 182 | - Використовуйте `mtr` для кращого трасування(простежити маршрут), щоб знаходити проблеми мережі. 183 | - Для того, щоб дізнатися, чому диск повністю забитий, використовуйте `ncdu`, це зберігає час у порівнянні з тим же `du -sh *`. 184 | - Для того, щоб дізнатися, який сокет або процес використовує інтернет, використовуйте `iftop` або `nethogs`. 185 | - додаток `ab` який поставляється разом з apache, корисний для швидкої і поверхневої перевірки продуктивності веб-сервера. Для більш серйозного лоад-тестінгу використовуйте `siege`. 186 | - Для більш серйозного дебаггінга мережі використовуйте `wireshark`,` tshark`, і `ngrep`. 187 | - Знайте про `strace` і` ltrace`. Ці команди можуть бути корисні, якщо програма падає або висить, і ви не знаєте чому або якщо ви хочете протестувати продуктивність програми. Не забувайте про можливість дебаггінга (`-c`) і можливість причепитися до процесу по pid (` -p`). 188 | - `ldd` для перевірки системних бібліотек. 189 | - Знайте як причепитися до працюючого процесу через `gdb` і отримати трасування стека. 190 | - Використовуйте `/proc`. Іноді він неймовірно корисний для налагодження запущених програм. Приклади: `/proc/cpuinfo`, `/proc/xxx/cwd`, ​​`/proc/xxx/exe`, `/proc/xxx/fd/`, `/proc/xxx/smaps` (де `xxx` id or pid процесу). 191 | - Коли дебажите щось, що зламалося в минулому, використовуйте `sar` буває дуже корисно. Показує історію та статистику CPU, пам'яті, мережі і т.д. 192 | - Для аналізу більш складних систем і продуктивності використовуйте `stap` ([SystemTap](https://sourceware.org/systemtap/wiki)), [`perf`](http://en.wikipedia.org/wiki/ Perf_(Linux)), і [`sysdig`](https://github.com/draios/sysdig). 193 | - Дізнайтеся, яка у вас операційна система, через `uname` або `uname -a` або `lsb_release -a`. 194 | - Використовуйте `dmesg`, коли щось відбувається зовсім дивне (це може бути проблеми із залізом або драйверами). 195 | 196 | 197 | ##Одним-рядком 198 | 199 | Кілька прикладів склеювання команд: 200 | - Це досить круто, що можна знайти множинні перетину файлів, з'єднати відсортовані файли і подивитися різницю в декількох файлів через `sort` /`uniq`. Це швидкий підхід і працює на файлах будь-якого розміру (включаючи багатогігабайтними файли). (Сортування не обмежена пам'яттю, але можливо вам доведеться додати `-T`, якщо `/tmp` знаходиться на невеликому логічному диску). Ще подивіться те, що було сказано вище про `LC_ALL`. Прапор сортування `-u` не використовується нижче, щоб було зрозуміліше: 201 | ```sh 202 | cat a b | sort | uniq > c # c is a union b 203 | cat a b | sort | uniq -d > c # c is a intersect b 204 | cat a b b | sort | uniq -u > c # c is set difference a - b 205 | ``` 206 | - Використовуйте `grep. *` для того, щоб подивитися вміст всіх файлів в директорії. Це може бути корисно для директорій заповнених конфігураціями як ці в `/sys`,` / proc`, `/ etc`. 207 | - Просумувати всі числа, які знаходяться в третій колонці текстового файлу (це в 3 рази швидше і 3 рази простіше, ніж робити це в Пітоні): 208 | ```sh 209 | awk '{ x += $3 } END { print x }' myfile 210 | ``` 211 | - Якщо вам потрібно подивитися розміри/дати файлів в дереві, це як рекурсивний `ls -l` але легше прочитати це `ls -lR`: 212 | ```sh 213 | find . -type f -ls 214 | ``` 215 | - Скажемо що у нас є якийсь текстовий файл, наприклад лог веб сервера і на якихось рядках з'являється значення, рядки з яким нам цікаві. Наприклад, `acct_id`. Давайте підрахуємо, скільки таких запитів в нашому логе: 216 | ```sh 217 | cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn 218 | ``` 219 | - Використовуйте `xargs` (або` parallel`). Зверніть увагу, що Ви можете контролювати кількість команд на кожен рядок, а так само паралельність. Якщо Ви не впевнені, що робите правильно, почніть з `xargs echo`. Ще `-I {}` - корисна штука. Приклади: 220 | ```sh 221 | find. -name '* .py' | xargs grep some_function 222 | cat hosts | xargs -I {} ssh root @ {} hostname 223 | ``` 224 | - Запустіть цю функцію, щоб отримати випадкову вибірку із цього документа: 225 | ```sh 226 | function taocl() { 227 | curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md | 228 | pandoc -f markdown -t html | 229 | xmlstarlet fo --html --dropdtd | 230 | xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" | 231 | xmlstarlet unesc | fmt -80 232 | } 233 | ``` 234 | 235 | 236 | ##Складно-але-корисно 237 | 238 | - `expr`: для виконання арифметичних і булевих операцій, а також регулярних виразів 239 | - `m4`: простий макро-процесор 240 | - `yes`: безкінечно виводить рядок 241 | - `cal`: хороший календар 242 | - `env`: виводить змінні середовища (корисно в Bash-скриптах) 243 | - `printenv`: показати змінні оточення (корисно в скриптах або дебаггінгу) 244 | - `look`: знайде англійські слова (або рядки у файлі) які починаються із рядках 245 | - `cut`, `paste` і` join`: маніпуляції з даними 246 | - `fmt`: форматування параграфів у тексті 247 | - `pr`: відформатовує текст в сторінки/колонки 248 | - `fold`: (обернути) обмежити довжину рядків у файлі 249 | - `column`: форматувати текст в колонки або таблиці 250 | - `expand` і` unexpand`: конвертація між табами і пробілами 251 | - `nl`: додає номери до рядків 252 | - `seq`: вивести послідовність чисел 253 | - `bc`: калькулятор 254 | - `factor`: піднести число в степінь 255 | - [`gpg`](https://gnupg.org/): зашифрувати і підписати файли 256 | - `toe`: таблиця терміналів terminfo з описом 257 | - `nc`: дебаггінг мережі і передачі даних 258 | - `socat`: перемикач сокетів і перенаправлення tcp-портів (схоже на `netcat`) 259 | - [`slurm`](https://github.com/mattthias/slurm): візуалізація трафіку мережі 260 | - `dd`: перенесення інформації між файлами фбо пристроями 261 | - `file`: визначає тип файлу 262 | - `tree`: показує директорії і піддиректорії у вигляді дерева, як `ls`, але рекурсивно 263 | - `stat`: інформація про файл 264 | - `time`: execute and time a commands 265 | - `timeout`: зупиняє коменду після того як завершиться вказаний чав в аргументі 266 | - `lockfile`: створює позначку в файлі який може бути видаленим тільки через команду `rm -f` 267 | - `logrotate`: змінити, зжати і відправити логи. 268 | - `watch`: запустити команду повторно, показуючи результати і/або виділення змін 269 | - `tac`: вивести файли посимвольно навпаки ("тівирп") 270 | - `shuf`: випадкова вибірка рядків з файлу 271 | - `comm`: порядково порівняти відсортовані файли 272 | - `pv`: моніторинг прогресу проходження інформації через пайп 273 | - `hd`, `hexdump`, `xxd`, `biew` і `bvi`: дамп і редагування бінарних файлів 274 | - `strings`: витягнути текст із бінарних файлів 275 | - `tr`: маніпуляція з char (символьним типом) 276 | - `iconv` або `uconv`: конвертація кодувань 277 | - `split` і `csplit`: розбити файли 278 | - `sponge`: прочитати весь інпут перед тим, як його записати. Корисно, коли читаєш з того ж файлу, куди записуєш. Наприклад, ось так: `grep -v something some-file | sponge some-file` 279 | - `units`: конвертер. Метри в кілометри, версти в п'яді (дивіться `/usr/share/units/definitions.units`) 280 | - `apg`: генерація паролів 281 | - `7z`: архіватор з високим ступенем стиснення 282 | - `ldd`: показує залежності програми від системних бібліотек 283 | - `nm`: symbols from object files 284 | - `ab`: бенчмаркінг веб-серверів 285 | - `strace`: дебагінг системних викликів 286 | - `mtr`: трасування для дебаггінга мережі 287 | - `cssh`: графічний конкурент Shel 288 | - `rsync`: синхронізація файлів і папок через SSH або на локальній файловій системі 289 | - `wireshark` і `tshark`: перехоплення пакетів і дебагінг мережі 290 | - `ngrep`: grep для шару мережі (network layer) 291 | - `host` і `dig`: пошук DNS 292 | - `lsof`: процесинг дескрипторів і інформація по сокетах 293 | - `dstat`: корисна статистика ОС 294 | - [`glances`](https://github.com/nicolargo/glances): високорівнева статистика з багатьма підсистемам 295 | - `iostat`: статистика використання жорсткого диска 296 | - `mpstat`: статистика використання CPU 297 | - `vmstat`: статистика використання оперативної пам'яті 298 | - `htop`: вдосконалена версія `top` 299 | - `last`: історія входів у систему 300 | - `w`: хто є залогіненим 301 | - `id`: інформація про користувача/групу 302 | - `sar`: historic system stats 303 | - `iftop` або` nethogs`: використання мережі конкретним сокетом або процесом 304 | - `ss`: статистика сокетів 305 | - `dmesg`: помилки завантаження і помилки системи 306 | - `sysctl`: перегляду і налаштування параметрів ядра Linux коли воно запущене 307 | - `hdparm`: маніпуляція/налаштування SATA/ATA диску 308 | - `lsb_release`: інформація про дистрибутив Linux 309 | - `lsblk`: cписок блокових пристроїв комп'ютера: дерево ваших дисків і логічних дисків 310 | - `lshw`, `lscpu`, `lspci`, `lsusb`, `dmidecode`: інформація про апаратне забезпечення, включає CPU, BIOS, RAID, графічну карту і т.д. 311 | - `lsmod` і `modinfo`: показує список і детальну інформацію модулів ядра. 312 | - `fortune`, `ddate`, and `sl`: um, well, it depends on whether you consider steam locomotives and Zippy quotations "useful" 313 | 314 | 315 | ##Macos-only 316 | 317 | Деякі речі, які підходять *тільки* для Мака. 318 | 319 | - Система управління пакетами - `brew` (Homebrew) і `port` (MacPorts) можуть бути використані для того, щоб встановити більшість програм, згаданих у цьому документі. 320 | - Копіюйте вивід будь-якої консольної команди до графічної за допомогою `pbcopy` і вставляйте вивід за допомогою `pbpaste`. 321 | - Щоб відкрити файл або десктопну програму, використовуйте `open` або `open -a /Applications/Whatever.app`. 322 | - Spotlight: Шукає файли в консолі, через `mdfind`, і дивиться метадані (наприклад EXIF ​​інформацію із фотографії) із `mdls`. 323 | - Не забувайте, що MacOS створений на основі BSD Unix і багато команд (наприклад `ps`, `ls`, `tail`, `awk`, `sed`) мають невеликі відмінності від лінуксових. Це обумовлено впливом `UNIX System V` і `GNU Tools`. Різницю можна помітити, побачивши заголовок "BSD General Commands Manual." Інколи на MacOS можна поставити GNU-версії програм, наприклад `gawk` і `gsed`. Коли пишете кросплатформені Bash-скрипти, намагайтеся уникати використовувати команди, які можуть відрізнятися (наприклад, краще використовуйте Python або `perl`), або ретельно все перевіряйте. 324 | 325 | 326 | ##Інші-джерела 327 | 328 | - [awesome-shell](https://github.com/alebcay/awesome-shell): Розширює Shell. 329 | - [awesome-osx-command-line](https://github.com/herrbischoff/awesome-osx-command-line): A more in-depth guide for the Mac OS command line. 330 | - [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/) щоб краще писати Shell скрипти. 331 | - [shellcheck](https://github.com/koalaman/shellcheck): A shell script static analysis tool. Essentially, lint for bash/sh/zsh. 332 | - [Filenames and Pathnames in Shell](http://www.dwheeler.com/essays/filenames-in-shell.html): The sadly complex minutiae on how to handle filenames correctly in shell scripts. 333 | 334 | 335 | ##Декламація 336 | 337 | За невеликим винятком, весь код написаний так, щоб інші його змогли прочитати. 338 | Той факт, що щось може бути написано на Bash, зовсім не означає, що воно має бути на ньому написано. ;) 339 | 340 | 341 | ## Ліцензія 342 | 343 | [![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) 344 | 345 | Ця работа і переклад на Українську мову розповсюджується за ліцензією [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/). 346 | -------------------------------------------------------------------------------- /README-zh-cn.md: -------------------------------------------------------------------------------- 1 | [ Languages: 2 | [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-cn.md), [繁體中文](README-zh-tw.md) 3 | ] 4 | 5 | 6 | # 命令行的艺术 7 | 8 | [![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) 9 | 10 | - [必读](#必读) 11 | - [基础](#基础) 12 | - [日常使用](#日常使用) 13 | - [文件及数据处理](#文件及数据处理) 14 | - [系统调试](#系统调试) 15 | - [单行脚本](#单行脚本) 16 | - [冷门但有用](#冷门但有用) 17 | - [仅限 MacOS X 系统](#仅限-macos-x-系统) 18 | - [更多资源](#更多资源) 19 | - [免责声明](#免责声明) 20 | - [授权条款](#授权条款) 21 | 22 | 23 | ![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](cowsay.png) 24 | 25 | 熟练使用命令行是一种常常被忽视,或被认为难以掌握的技能,但实际上,它会提高你作为工程师的灵活性以及生产力。本文是一份我在 Linux 上工作时,发现的一些命令行使用技巧的摘要。有些技巧非常基础,而另一些则相当复杂,甚至晦涩难懂。这篇文章并不长,但当你能够熟练掌握这里列出的所有技巧时,你就学会了很多关于命令行的东西了。 26 | 27 | 这篇文章是[许多作者和译者](AUTHORS.md)共同的成果。这里的大部分内容 28 | [首次](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands) 29 | [出现](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix) 30 | 于 [Quora](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know),但考虑到这里的人们都具有学习的天赋且乐于接受别人的建议,使用 Github 来做这件事是更佳的选择。如果你在本文中发现了错误或者存在可以改善的地方,请果断提交 Issue 或 Pull Request!(当然在提交前请看一下必读节和已有的 PR/issue)。 31 | 32 | 33 | ## 必读 34 | 35 | 涵盖范围: 36 | 37 | - 这篇文章对刚接触命令行的新手以及具有命令行使用经验的人都有用处。本文致力于做到*覆盖面广*(尽量包括一切重要的内容),*具体*(给出最常见的具体的例子)以及*简洁*(避免不必要的,或是可以在其他地方轻松查到的细枝末节)。每个技巧在特定情境下或是基本的,或是能显著节约时间。 38 | - 本文为 Linux 所写,除了[仅限 MacOS X 系统](#仅限-macos-x-系统)节。其它节中的大部分内容都适用于其它 Unix 系统或 MacOS 系统,甚至 Cygwin。 39 | - 本文关注于交互式 Bash,尽管很多技巧也适用于其他 shell 或 Bash 脚本。 40 | - 本文包括了“标准的”Unix 命令和需要安装特定包的命令,只要它们足够重要。 41 | 42 | 注意事项: 43 | 44 | - 为了能在一页内展示尽量多的东西,一些具体的信息会被间接的包含在引用页里。聪明机智的你如果掌握了使用 Google 搜索引擎的基本思路与命令,那么你将可以查阅到更多的详细信息。使用 `apt-get`/`yum`/`dnf`/`pacman`/`pip`/`brew`(以及其它合适的包管理器)来安装新程序。 45 | - 使用 [Explainshell](http://explainshell.com/) 去获取相关命令、参数、管道等内容的解释。 46 | 47 | 48 | ## 基础 49 | 50 | - 学习 Bash 的基础知识。具体来说,输入 `man bash` 并至少全文浏览一遍; 它很简单并且不长。其他的 shell 可能很好用,但 Bash 功能强大且几乎所有情况下都是可用的 ( *只*学习 zsh,fish 或其他的 shell 的话,在你自己的电脑上会显得很方便,但在很多情况下会限制你,比如当你需要在服务器上工作时)。 51 | 52 | - 学习并掌握至少一个基于文本的编辑器。通常 Vim (`vi`) 会是你最好的选择,因为在终端里进行随机编辑 Vim 真的毫无敌手,哪怕是 Emacs、某大型 IDE 甚至时下非常流行的编辑器。 53 | 54 | - 学会如何使用 `man` 命令去阅读文档。学会使用 `apropos` 去查找文档。了解有些命令并不对应可执行文件,而是Bash内置的,可以使用 `help` 和 `help -d` 命令获取帮助信息。 55 | 56 | - 学会使用 `>` 和 `<` 来重定向输出和输入,学会使用 `|` 来重定向管道。明白 `>` 会覆盖了输出文件而 `>>` 是在文件未添加。了解标准输出 stdout 和标准错误 stderr。 57 | 58 | - 学会使用通配符 `*` (或许再算上 `?` 和 `[`...`]`) 和引用以及引用中 `'` 和 `"` 的区别。 59 | 60 | - 熟悉 Bash 任务管理工具:`&`,**ctrl-z**,**ctrl-c**,`jobs`,`fg`,`bg`,`kill` 等。 61 | 62 | - 了解 `ssh`,以及学会通过使用 `ssh-agent`,`ssh-add` 等命令来实现基本的无密码认证。 63 | 64 | - 学会基本的文件管理:`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`。知道 inode 是什么(与 `ls -i` 和 `df -i` 等命令相关)。 65 | 66 | - 学习基本的网络管理:`ip` 或 `ifconfig`,`dig`。 67 | 68 | - 熟悉正则表达式,以及 `grep`/`egrep` 里不同参数的作用,例如 `-i`,`-o`,`-v`,`-A`,`-B` 和 `-C`,这些参数是值得学习并掌握的。 69 | 70 | - 学会使用 `apt-get`,`yum`,`dnf` 或 `pacman` (取决于你使用的 Linux 发行版)来查找或安装软件包。并确保你的环境中有 `pip` 来安装基于 Python 的命令行工具 (接下来提到的部分程序使用 `pip` 来安装会很方便)。 71 | 72 | 73 | ## 日常使用 74 | 75 | - 在 Bash 中,可以使用 **Tab** 自动补全参数,使用 **ctrl-r** 搜索命令行历史(在按下之后,键入便可以搜索,重复按下 **ctrl-r** 会在更多匹配中循环,按下 **Enter** 会执行找到的命令,按下右方向键会将结果放入当前行中,使你可以进行编辑)。 76 | 77 | - 在 Bash 中,可以使用 **ctrl-w** 删除你键入的最后一个单词,使用 **ctrl-u** 删除整行,使用 **alt-b** 和 **alt-f** 以单词为单位移动光标,使用 **ctrl-a** 将光标移至行首,使用 **ctrl-e** 将光标移至行尾,使用 **ctrl-k** 删除光标至行尾的所有内容,使用 **ctrl-l** 清屏。键入 `man readline` 查看 Bash 中的默认快捷键,内容很多。例如 **alt-.** 循环地移向前一个参数,以及 **alt-*** 展开通配符。 78 | 79 | - 你喜欢的话,可以键入 `set -o vi` 来使用 vi 风格的快捷键,而 `set -o emacs` 可以把它改回来。 80 | 81 | - 为了方便地键入长命令,在设置你的编辑器后(例如 `export EDITOR=vim`),键入 **ctrl-x** **ctrl-e** 会打开一个编辑器来编辑当前命令。在 vi 模式下则键入 **escape-v** 实现相同的功能。 82 | 83 | - 键入 `history` 查看命令行历史记录。其中有许多缩写,例如 `!$`(最后键入的参数)和 `!!`(最后键入的命令),尽管通常被 **ctrl-r** 和 **alt-.** 取代。 84 | 85 | - 回到上一个工作路径:`cd -` 86 | 87 | - 如果你输入命令的时候改变了主意,按下 **alt-#** 来在行首添加 `#`,或者依次按下 **ctrl-a**, **#**, **enter**。这样做的话,之后你可以很方便的利用命令行历史回到你刚才输入到一半的命令。 88 | 89 | - 使用 `xargs` ( 或 `parallel`)。他们非常给力。注意到你可以控制每行参数个数(`-L`)和最大并行数(`-P`)。如果你不确定它们是否会按你想的那样工作,先使用 `xargs echo` 查看一下。此外,使用 `-I{}` 会很方便。例如: 90 | ```bash 91 | find . -name '*.py' | xargs grep some_function 92 | cat hosts | xargs -I{} ssh root@{} hostname 93 | ``` 94 | 95 | - `pstree -p` 有助于展示进程树。 96 | 97 | - 使用 `pgrep` 和 `pkill` 根据名字查找进程或发送信号(`-f` 参数通常有用)。 98 | 99 | - 了解你可以发往进程的信号的种类。比如,使用 `kill -STOP [pid]` 停止一个进程。使用 `man 7 signal` 查看详细列表。 100 | 101 | - 使用 `nohup` 或 `disown` 使一个后台进程持续运行。 102 | 103 | - 使用 `netstat -lntp` 或 `ss -plat` 检查哪些进程在监听端口(默认是检查 TCP 端口; 使用参数 `-u` 检查 UDP 端口)。 104 | 105 | - 有关打开套接字和文件,请参阅 `lsof`。 106 | 107 | - 使用 `uptime` 或 `w` 来查看系统已经运行多长时间。 108 | 109 | - 使用 `alias` 来创建常用命令的快捷形式。例如:`alias ll='ls -latr'` 使你可以方便地执行`ls -latr`命令。 110 | 111 | - 在 Bash 脚本中,使用 `set -x` 去调试输出,尽可能的使用严格模式,使用 `set -e` 令脚本在发生错误时退出而不是继续运行,使用 `set -u` 来检查是否使用了未赋值的变量,使用 `set -o pipefail` 严谨地对待错误(尽管问题可能很微妙)。当牵扯到很多脚本时,使用 `trap`。一个好的习惯是在脚本文件开头这样写,这会使它检测一些错误,并在错误发生时中断程序并输出信息: 112 | ```bash 113 | set -euo pipefail 114 | trap "echo 'error: Script failed: see failed command above'" ERR 115 | ``` 116 | 117 | - 在 Bash 脚本中,子 shell(使用括号 `(...)`)是一种组织参数的便捷方式。一个常见的例子是临时地移动工作路径,代码如下: 118 | ```bash 119 | # do something in current dir 120 | (cd /some/other/dir && other-command) 121 | # continue in original dir 122 | ``` 123 | 124 | - 在 Bash 中,要注意其中有许多形式的扩展。检查变量是否存在:`${name:?error message}`。例如,当 Bash 脚本需要一个参数时,可以使用这样的代码 `input_file=${1:?usage: $0 input_file}`。数学表达式:`i=$(( (i + 1) % 5 ))`。序列:`{1..10}`。截断字符串:`${var%suffix}` 和 `${var#prefix}`。例如,假设 `var=foo.pdf`,那么 `echo ${var%.pdf}.txt` 将输出 `foo.txt`。 125 | 126 | - 使用括号扩展(`{`...`}`)来减少输入相似文本,并自动化文本组合。这在某些情况下会很有用,例如 `mv foo.{txt,pdf} some-dir`(同时移动两个文件),`cp somefile{,.bak}`(会被扩展成 `cp somefile somefile.bak`)或者 `mkdir -p test-{a,b,c}/subtest-{1,2,3}`(会被扩展成所有可能的组合,并创建一个目录树)。 127 | 128 | - 通过使用 `<(some command)` 可以将输出视为文件。例如,对比本地文件 `/etc/hosts` 和一个远程文件: 129 | ```sh 130 | diff /etc/hosts <(ssh somehost cat /etc/hosts) 131 | ``` 132 | 133 | - 了解 Bash 中的“here documents”,例如 `cat <logfile 2>&1`。通常,为了保证命令不会在标准输入里残留一个打开了的文件句柄导致你当前所在的终端无法操作,添加 ` bar: 212 | repren --full --preserve-case --from foo --to bar . 213 | # Recover backup files whatever.bak -> whatever: 214 | repren --renames --from '(.*)\.bak' --to '\1' *.bak 215 | # Same as above, using rename, if available: 216 | rename 's/\.bak$//' *.bak 217 | ``` 218 | 219 | - 根据 man 页面的描述,`rsync` 真的是一个快速且非常灵活的文件复制工具。它通常被用于机器间的同步,但在本地也同样有用。它同时也是删除大量文件的[最快方法](https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html)之一: 220 | ```sh 221 | mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir 222 | ``` 223 | 224 | - 使用 `shuf` 从一个文件中随机选取多行。 225 | 226 | - 了解 `sort` 的参数。处理数字方面,使用 `-n` 或者 `-h` 来处理可读性数字(例如 `du -h` 的输出)。明白键的工作原理(`-t` 和 `-k`)。例如,注意到你需要 `-k1,1` 来仅按第一个域来排序,而 `-k1` 意味着按整行排序。稳定排序(`sort -s`)在某些情况下很有用。例如,以第二个域为主关键字,第一个域为次关键字进行排序,你可以使用 `sort -k1,1 | sort -s -k2,2`。 227 | 228 | - 如果你想在 Bash 命令行中写 tab 制表符,按下 **ctrl-v** **[Tab]** 或键入 `$'\t'` (后者可能更好,因为你可以复制粘贴它)。 229 | 230 | - 标准的源代码对比及合并工具是 `diff` 和 `patch`。使用 `diffstat` 查看变更总览数据。注意到 `diff -r` 对整个文件夹有效。使用 `diff -r tree1 tree2 | diffstat` 查看变更总览数据。 231 | 232 | - 对于二进制文件,使用 `hd` 使其以十六进制显示以及使用 `bvi` 来编辑二进制。 233 | 234 | - 同样对于二进制文件,`strings`(包括 `grep` 等等)允许你查找一些文本。 235 | 236 | - 二进制文件对比(Delta 压缩),使用 `xdelta3`。 237 | 238 | - 使用 `iconv` 更改文本编码。而更高级的用法,可以使用 `uconv`,它支持一些高级的 Unicode 功能。例如,这条命令将所有元音字母转为小写并移除了: 239 | ```sh 240 | uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt 241 | ``` 242 | 243 | - 拆分文件,查看 `split`(按大小拆分)和 `csplit`(按模式拆分)。 244 | 245 | - 用 [`dateutils`](http://www.fresse.org/dateutils/) 中的 `dateadd`, `datediff`, `strptime` 等工具操作日期和时间表达式。 246 | 247 | - 使用 `zless`,`zmore`,`zcat` 和 `zgrep` 对压缩过的文件进行操作。 248 | 249 | 250 | ## 系统调试 251 | 252 | - `curl` 和 `curl -I` 可以便捷地被应用于 web 调试中,它们的好兄弟 `wget` 也可以,或者是更潮的 [`httpie`](https://github.com/jakubroztocil/httpie)。 253 | 254 | - 使用 `iostat`、`netstat`、`top` (`htop` 更佳)和 `dstat` 去获取硬盘、cpu 和网络的状态。熟练掌握这些工具可以使你快速的对系统的当前状态有一个大概的认识。 255 | 256 | - 使用 `netstat` 和 `ss` 查看网络连接的细节。 257 | 258 | - 若要对系统有一个深度的总体认识,使用 [`glances`](https://github.com/nicolargo/glances)。它在一个终端窗口中向你提供一些系统级的数据。这对于快速的检查各个子系统非常有帮助。 259 | 260 | - 若要了解内存状态,运行并理解 `free` 和 `vmstat` 的输出。尤其注意“cached”的值,它指的是 Linux 内核用来作为文件缓存的内存大小,因此它与空闲内存无关。 261 | 262 | - Java 系统调试则是一件截然不同的事,一个可以用于 Oracle 的 JVM 或其他 JVM 上的调试的技巧是你可以运行 `kill -3 ` 同时一个完整的栈轨迹和堆概述(包括 GC 的细节)会被保存到标准输出/日志文件。JDK 中的 `jps`,`jstat`,`jstack`,`jmap` 很有用。[SJK tools](https://github.com/aragozin/jvm-tools) 更高级. 263 | 264 | - 使用 `mtr` 去跟踪路由,用于确定网络问题。 265 | 266 | - 用 `ncdu` 来查看磁盘使用情况,它比常用的命令,如 `du -sh *`,更节省时间。 267 | 268 | - 查找正在使用带宽的套接字连接或进程,使用 `iftop` 或 `nethogs`。 269 | 270 | - `ab` 工具(捆绑于 Apache)可以简单粗暴地检查 web 服务器的性能。对于更复杂的负载测试,使用 `siege`。 271 | 272 | - `wireshark`,`tshark` 和 `ngrep` 可用于复杂的网络调试。 273 | 274 | - 了解 `strace` 和 `ltrace`。这俩工具在你的程序运行失败、挂起甚至崩溃,而你却不知道为什么或你想对性能有个总体的认识的时候是非常有用的。注意 profile 参数(`-c`)和附加到一个运行的进程参数 (`-p`)。 275 | 276 | - 了解使用 `ldd` 来检查共享库。 277 | 278 | - 了解如何运用 `gdb` 连接到一个运行着的进程并获取它的堆栈轨迹。 279 | 280 | - 学会使用 `/proc`。它在调试正在出现的问题的时候有时会效果惊人。比如:`/proc/cpuinfo`,`/proc/meminfo`,`/proc/cmdline`,`/proc/xxx/cwd`,`/proc/xxx/exe`,`/proc/xxx/fd/`,`/proc/xxx/smaps`(这里的 `xxx` 表示进程的 id 或 pid)。 281 | 282 | - 当调试一些之前出现的问题的时候,`sar` 非常有用。它展示了 cpu、内存以及网络等的历史数据。 283 | 284 | - 关于更深层次的系统分析以及性能分析,看看 `stap`([SystemTap](https://sourceware.org/systemtap/wiki)),[`perf`](http://en.wikipedia.org/wiki/Perf_(Linux)),以及[`sysdig`](https://github.com/draios/sysdig)。 285 | 286 | - 查看你当前使用的系统,使用 `uname` , `uname -a` (Unix/kernel 信息) 或者 `lsb_release -a` (Linux 发行版信息)。 287 | 288 | - 无论什么东西工作得很欢乐时试试 `dmesg`(可能是硬件或驱动问题)。 289 | 290 | 291 | ## 单行脚本 292 | 293 | 一些命令组合的例子: 294 | 295 | - 当你需要对文本文件做集合交、并、差运算时,结合使用 `sort`/`uniq` 很有帮助。假设 `a` 与 `b` 是两内容不同的文件。这种方式效率很高,并且在小文件和上G的文件上都能运用 (`sort` 不被内存大小约束,尽管在 `/tmp` 在一个小的根分区上时你可能需要 `-T` 参数),参阅前文中关于 `LC_ALL` 和 `sort` 的 `-u` 参数的部分。 296 | ```sh 297 | cat a b | sort | uniq > c # c is a union b 298 | cat a b | sort | uniq -d > c # c is a intersect b 299 | cat a b b | sort | uniq -u > c # c is set difference a - b 300 | ``` 301 | 302 | - 使用 `grep . *`(每行都会附上文件名)或者 `head -100 *`(每个文件有一个标题)来阅读检查目录下所有文件的内容。这在检查一个充满配置文件的目录(如 `/sys`、`/proc`、`/etc`)时特别好用。 303 | 304 | - 计算文本文件第三列中所有数的和(可能比同等作用的 Python 代码快三倍且代码量少三倍): 305 | ```sh 306 | awk '{ x += $3 } END { print x }' myfile 307 | ``` 308 | 309 | - 如果你想在文件树上查看大小/日期,这可能看起来像递归版的 `ls -l` 但比 `ls -lR` 更易于理解: 310 | ```sh 311 | find . -type f -ls 312 | ``` 313 | 314 | - 假设你有一个类似于 web 服务器日志文件的文本文件,并且一个确定的值只会出现在某些行上,假设一个 `acct_id` 参数在URI中。如果你想计算出每个 `acct_id` 值有多少次请求,使用如下代码: 315 | ```sh 316 | cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn 317 | ``` 318 | 319 | - 运行这个函数从这篇文档中随机获取一条技巧(解析 Markdown 文件并抽取项目): 320 | ```sh 321 | function taocl() { 322 | curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md | 323 | pandoc -f markdown -t html | 324 | xmlstarlet fo --html --dropdtd | 325 | xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" | 326 | xmlstarlet unesc | fmt -80 327 | } 328 | ``` 329 | 330 | 331 | ## 冷门但有用 332 | 333 | - `expr`:计算表达式或正则匹配 334 | 335 | - `m4`:简单地宏处理器 336 | 337 | - `yes`:多次打印字符串 338 | 339 | - `cal`:漂亮的日历 340 | 341 | - `env`:执行一个命令(脚本文件中很有用) 342 | 343 | - `printenv`:打印环境变量(调试时或在使用脚本文件时很有用) 344 | 345 | - `look`:查找以特定字符串开头的单词 346 | 347 | - `cut`、`paste` 和 `join`:数据修改 348 | 349 | - `fmt`:格式化文本段落 350 | 351 | - `pr`:将文本格式化成页/列形式 352 | 353 | - `fold`:包裹文本中的几行 354 | 355 | - `column`:将文本格式化成多列或表格 356 | 357 | - `expand` 和 `unexpand`:制表符与空格之间转换 358 | 359 | - `nl`:添加行号 360 | 361 | - `seq`:打印数字 362 | 363 | - `bc`:计算器 364 | 365 | - `factor`:分解因数 366 | 367 | - [`gpg`](https://gnupg.org/):加密并签名文件 368 | 369 | - `toe`:terminfo entries 列表 370 | 371 | - `nc`:网络调试及数据传输 372 | 373 | - `socat`:套接字代理,与 `netcat` 类似 374 | 375 | - [`slurm`](https://github.com/mattthias/slurm):网络可视化 376 | 377 | - `dd`:文件或设备间传输数据 378 | 379 | - `file`:确定文件类型 380 | 381 | - `tree`:以树的形式显示路径和文件,类似于递归的 `ls` 382 | 383 | - `stat`:文件信息 384 | 385 | - `time`:执行命令,并计算执行时间 386 | 387 | - `lockfile`:使文件只能通过 `rm -f` 移除 388 | 389 | - `logrotate`: 切换、压缩以及发送日志文件 390 | 391 | - `watch`:重复运行同一个命令,展示结果并高亮有更改的部分 392 | 393 | - `tac`:反向输出文件 394 | 395 | - `shuf`:文件中随机选取几行 396 | 397 | - `comm`:一行一行的比较排序过的文件 398 | 399 | - `pv`:监视通过管道的数据 400 | 401 | - `hd`,`hexdump`,`xxd`,`biew` 和 `bvi`:保存或编辑二进制文件 402 | 403 | - `strings`:从二进制文件中抽取文本 404 | 405 | - `tr`:转换字母 406 | 407 | - `iconv` 或 `uconv`:简易的文件编码 408 | 409 | - `split` 和 `csplit`:分割文件 410 | 411 | - `sponge`:在写入前读取所有输入,在读取文件后再向同一文件写入时比较有用,例如 `grep -v something some-file | sponge some-file` 412 | 413 | - `units`:将一种计量单位转换为另一种等效的计量单位(参阅 `/usr/share/units/definitions.units`) 414 | 415 | - `apg`:随机生成密码 416 | 417 | - `7z`:高比例的文件压缩 418 | 419 | - `ldd`:动态库信息 420 | 421 | - `nm`:提取 obj 文件中的符号 422 | 423 | - `ab`:性能分析 web 服务器 424 | 425 | - `strace`:系统调用调试 426 | 427 | - `mtr`:更好的网络调试跟踪工具 428 | 429 | - `cssh`:可视化的并发 shell 430 | 431 | - `rsync`:通过 ssh 或本地文件系统同步文件和文件夹 432 | 433 | - `wireshark` 和 `tshark`:抓包和网络调试工具 434 | 435 | - `ngrep`:网络层的 grep 436 | 437 | - `host` 和 `dig`:DNS 查找 438 | 439 | - `lsof`:列出当前系统打开文件的工具以及查看端口信息 440 | 441 | - `dstat`:系统状态查看 442 | 443 | - [`glances`](https://github.com/nicolargo/glances):高层次的多子系统总览 444 | 445 | - `iostat`:硬盘使用状态 446 | 447 | - `mpstat`: CPU 使用状态 448 | 449 | - `vmstat`: 内存使用状态 450 | 451 | - `htop`:top 的加强版 452 | 453 | - `last`:登入记录 454 | 455 | - `w`:查看处于登录状态的用户 456 | 457 | - `id`:用户/组 ID 信息 458 | 459 | - `sar`:系统历史数据 460 | 461 | - `iftop` 或 `nethogs`:套接字及进程的网络利用 462 | 463 | - `ss`:套接字数据 464 | 465 | - `dmesg`:引导及系统错误信息 466 | 467 | - `sysctl`: 在内核运行时动态地查看和修改内核的运行参数 468 | 469 | - `hdparm`:SATA/ATA 磁盘更改及性能分析 470 | 471 | - `lsb_release`:Linux 发行版信息 472 | 473 | - `lsblk`:列出块设备信息:以树形展示你的磁盘以及磁盘分区信息 474 | 475 | - `lshw`,`lscpu`,`lspci`,`lsusb` 和 `dmidecode`:查看硬件信息,包括 CPU、BIOS、RAID、显卡、USB设备等 476 | 477 | - `lsmod` 和 `modinfo`:列出内核模块,并显示其细节 478 | 479 | - `fortune`,`ddate` 和 `sl`:额,这主要取决于你是否认为蒸汽火车和莫名其妙的名人名言是否“有用” 480 | 481 | ## 仅限 MacOS X 系统 482 | 483 | 以下是*仅限于* MacOS 系统的技巧 484 | 485 | - 用 `brew` (Homebrew)或者 `port` (MacPorts)进行包管理。这些可以用来在 Mac 系统上安装以上的大多数命令。 486 | 487 | - 用 `pbcopy` 复制任何命令的输出到桌面应用,用 `pbpaste` 粘贴输入。 488 | 489 | - 若要在 Mac OS 终端中将 Option 键视为 alt 键(例如在上面介绍的 **alt-b**, **alt-f** 等命令中用到),打开 偏好设置 -> 描述文件 -> 键盘 并勾选“使用 Option 键作为 Meta 键”。 490 | 491 | - 用 `open` 或者 `open -a /Applications/Whatever.app` 使用桌面应用打开文件。 492 | 493 | - Spotlight: 用 `mdfind` 搜索文件,用 `mdls` 列出元数据(例如照片的 EXIF 信息)。 494 | 495 | - 注意 MacOS 系统是基于 BSD UNIX 的,许多命令(例如 `ps`,`ls`,`tail`,`awk`,`sed`)都和 Linux 中有些微的不同,这些极大的被 System V-style Unix 和 GNU 工具影响。你可以通过标题为 "BSD General Commands Manual" 的 man 页面发现这些不同。在有些情况下 GNU 版本的命令也可能被安装(例如 `gawk` 和 `gsed` 对应 GNU 中的 awk 和 sed )。如果要写跨平台的 Bash 脚本,避免使用这些命令(例如,考虑 Python 或者 `perl` )或者经过仔细的测试。 496 | 497 | - 用 `sw_vers` 获取 MacOS 的版本信息。 498 | 499 | 500 | ## 更多资源 501 | 502 | - [awesome-shell](https://github.com/alebcay/awesome-shell):一份精心组织的命令行工具及资源的列表。 503 | - [awesome-osx-command-line](https://github.com/herrbischoff/awesome-osx-command-line):一份针对 Mac OS 命令行的更深入的指南。 504 | - [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/):为了编写更好的脚本文件。 505 | - [shellcheck](https://github.com/koalaman/shellcheck):一个静态 shell 脚本分析工具,本质上是 bash/sh/zsh 的 lint。 506 | - [Filenames and Pathnames in Shell](http://www.dwheeler.com/essays/filenames-in-shell.html):有关如何在 shell 脚本里正确处理文件名的细枝末节。 507 | 508 | 509 | ## 免责声明 510 | 511 | 除去特别微小的任务,编写代码是出于方便阅读的目的。能力往往伴随着责任。你 *可以* 在 Bash 中做一些事并不意味着你应该去做!;) 512 | 513 | 514 | ## 授权条款 515 | 516 | [![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) 517 | 518 | 本文使用授权协议 [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/)。 519 | -------------------------------------------------------------------------------- /README-zh-tw.md: -------------------------------------------------------------------------------- 1 | [ Languages: 2 | [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-cn.md), [繁體中文](README-zh-tw.md) 3 | ] 4 | 5 | 6 | # 命令列的藝術 7 | 8 | [![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) 9 | 10 | - [必讀](#必讀) 11 | - [基礎](#基礎) 12 | - [日常使用](#日常使用) 13 | - [檔案及資料處理](#檔案及資料處理) 14 | - [系統偵錯](#系統偵錯) 15 | - [單行指令碼](#單行指令碼) 16 | - [冷門但實用](#冷門但實用) 17 | - [僅限 MacOS X 系統](#僅限-macos-x-系統) 18 | - [更多資源](#更多資源) 19 | - [免責聲明](#免責聲明) 20 | - [授權條款](#授權條款) 21 | 22 | 23 | ![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](cowsay.png) 24 | 25 | 熟練使用命令列是一種常常被忽視,或被認為難以掌握的技能,但實際上,它會提高你作為工程師的靈活性以及生產力。本文是一份我在 Linux 上工作時,發現的一些命令列使用技巧的摘要。有些技巧非常基礎,而另一些則相當複雜,甚至晦澀難懂。這篇文章並不長,但當你能夠熟練掌握這裡列出的所有技巧時,你就學會了很多關於命令列的東西了。 26 | 27 | 這篇文章是[許多作者和譯者](AUTHORS.md)共同的成果。這裡的大部分內容[首次](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands)[出現](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix)於 [Quora](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know),但考慮到這裡的人們都具有學習的天賦且樂於接受別人的建議,使用 Github 來做這件事是更佳的選擇。如果你在本文中發現了錯誤或者存在可以改善的地方,請果斷提交 Issue 或 Pull Request!(當然在提交前請看一下必已有的 PR/issue) 。 28 | 29 | 30 | ## 必讀 31 | 32 | 涵蓋範圍: 33 | 34 | - 這篇文章對剛接觸命令列的新手以及具有命令列使用經驗的人都有用處。本文致力於做到*覆蓋面廣* (儘量包括一切重要的內容),*具體* (給出最常見的具體的例子) 以及*簡潔* (避免不必要的,或是可以在其他地方輕鬆查到的細枝末節)。每個技巧在特定情境下或是基本的,或是能顯著節約時間。 35 | - 本文為 Linux 所寫,除了[僅限 MacOS X 系統](#僅限-macos-x-系統)節。其它節中的大部分內容都適用於其它 Unix 系統或 MacOS 系統,甚至 Cygwin。 36 | - 本文關注於互動式 Bash,儘管很多技巧也適用於其他 shell 或 Bash 指令碼。 37 | - 本文包括了“標準的”Unix 命令和需要安裝特定包的命令,只要它們足夠重要。 38 | 39 | 注意事項: 40 | 41 | - 為了能在一頁內展示儘量多的東西,一些具體的資訊會被間接的包含在引用頁裡。聰明機智的你如果掌握了使用 Google 搜尋引擎的基本思路與命令,那麼你將可以查閱到更多的詳細資訊。使用 `apt-get`/`yum`/`dnf`/`pacman`/`pip`/`brew` (以及其它合適的套件管理員) 來安裝新程式。 42 | - 使用 [Explainshell](http://explainshell.com/) 去獲取相關命令、參數、管道等內容的解釋。 43 | 44 | 45 | ## 基礎 46 | 47 | - 學習 Bash 的基礎知識。具體來說,輸入 `man bash` 並至少全文瀏覽一遍; 它很簡單並且不長。其他的 shell 可能很好用,但 Bash 功能強大且幾乎所有情況下都是可用的 (*只*學習 zsh,fish 或其他的 shell 的話,在你自己的電腦上會顯得很方便,但在很多情況下會限制你,比如當你需要在伺服器上工作時)。 48 | 49 | - 學習並掌握至少一個基於文字的編輯器。通常 Vim (`vi`) 會是你最好的選擇,因為在終端裡進行隨機編輯 Vim 真的毫無敵手,哪怕是 Emacs、某大型 IDE 甚至時下非常流行的編輯器。 50 | 51 | - 學會如何使用 `man` 命令去閱讀文件。學會使用 `apropos` 去查詢文件。瞭解有些命令並不對應可執行檔案,而是 Bash 內建的,可以使用 `help` 和 `help -d` 命令獲取幫助資訊。 52 | 53 | - 學會使用 `>` 和 `<` 來重定向輸出和輸入,學會使用 `|` 來重定向管道。明白 `>` 會覆蓋了輸出檔案而 `>>` 是在檔案未新增。瞭解標準輸出 stdout 和標準錯誤 stderr。 54 | 55 | - 學會使用通配符 `*` (或許再算上 `?` 和 `[`...`]`) 和引用以及引用中 `'` 和 `"` 的區別。 56 | 57 | - 熟悉 Bash 任務管理工具:`&`,**ctrl-z**,**ctrl-c**,`jobs`,`fg`,`bg`,`kill` 等。 58 | 59 | - 瞭解 `ssh`,以及學會通過使用 `ssh-agent`,`ssh-add` 等命令來實現基本的無密碼認證。 60 | 61 | - 學會基本的檔案管理:`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`。知道 inode 是什麼 (與 `ls -i` 和 `df -i` 等命令相關)。 62 | 63 | - 學習基本的網路管理:`ip` 或 `ifconfig`,`dig`。 64 | 65 | - 熟悉正則表示式,以及 `grep`/`egrep` 裡不同參數的作用,例如 `-i`,`-o`,`-v`,`-A`,`-B` 和 `-C`,這些參數是值得學習並掌握的。 66 | 67 | - 學會使用 `apt-get`,`yum`,`dnf` 或 `pacman` (取決於你使用的 Linux 發行版) 來查詢或安裝軟體套件。並確保你的環境中有 `pip` 來安裝基於 Python 的命令列工具 (接下來提到的部分程式使用 `pip` 來安裝會很方便)。 68 | 69 | 70 | ## 日常使用 71 | 72 | - 在 Bash 中,可以使用 **Tab** 自動補全參數,使用 **ctrl-r** 搜尋命令列歷史 (在按下之後,鍵入便可以搜尋,重複按下 **ctrl-r** 會在更多匹配中迴圈,按下 **Enter** 會執行找到的命令,按下右方向鍵會將結果放入當前行中,使你可以進行編輯)。 73 | 74 | - 在 Bash 中,可以使用 **ctrl-w** 刪除你鍵入的最後一個單詞,使用 **ctrl-u** 刪除整行,使用 **alt-b** 和 **alt-f** 以單詞為單位移動游標,使用 **ctrl-a** 將游標移至行首,使用 **ctrl-e** 將游標移至行尾,使用 **ctrl-k** 刪除游標至行尾的所有內容,使用 **ctrl-l** 清屏。鍵入 `man readline` 檢視 Bash 中的預設快捷鍵,內容很多。例如 **alt-.** 迴圈地移向前一個參數,以及 **alt-*** 展開通配符。 75 | 76 | - 你喜歡的話,可以鍵入 `set -o vi` 來使用 vi 風格的快捷鍵,而 `set -o emacs` 可以把它改回來。 77 | 78 | - 為了方便地鍵入長命令,在設定你的編輯器後 (例如 `export EDITOR=vim`),鍵入 **ctrl-x** **ctrl-e** 會開啟一個編輯器來編輯當前命令。在 vi 模式下則鍵入 **escape-v** 實現相同的功能。 79 | 80 | - 鍵入 `history` 檢視命令列歷史記錄。其中有許多縮寫,例如 `!$` (最後鍵入的參數) 和 `!!` (最後鍵入的命令),儘管通常被 **ctrl-r** 和 **alt-.** 取代。 81 | 82 | - 回到上一個工作路徑:`cd -` 83 | 84 | - 如果你輸入命令的時候改變了主意,按下 **alt-#** 來在行首新增 `#`,或者依次按下 **ctrl-a**, **#**, **enter**。這樣做的話,之後你可以很方便的利用命令列歷史回到你剛才輸入到一半的命令。 85 | 86 | - 使用 `xargs` ( 或 `parallel`)。他們非常給力。注意到你可以控制每行參數個數 (`-L`) 和最大並行數 (`-P`)。如果你不確定它們是否會按你想的那樣工作,先使用 `xargs echo` 檢視一下。此外,使用 `-I{}` 會很方便。例如: 87 | 88 | ```bash 89 | find . -name '*.py' | xargs grep some_function 90 | cat hosts | xargs -I{} ssh root@{} hostname 91 | ``` 92 | 93 | - `pstree -p` 有助於展示程序樹。 94 | 95 | - 使用 `pgrep` 和 `pkill` 根據名字查詢程序或傳送訊號 (`-f` 參數通常有用)。 96 | 97 | - 瞭解你可以發往程序的訊號的種類。比如,使用 `kill -STOP [pid]` 停止一個程序。使用 `man 7 signal` 檢視詳細列表。 98 | 99 | - 使用 `nohup` 或 `disown` 使一個後臺程序持續執行。 100 | 101 | - 使用 `netstat -lntp` 或 `ss -plat` 檢查哪些程序在監聽埠 (預設是檢查 TCP 埠; 使用參數 `-u` 檢查 UDP 埠)。 102 | 103 | - 有關開啟套接字和檔案,請參閱 `lsof`。 104 | 105 | - 使用 `uptime` 或 `w` 來檢視系統已經執行多長時間。 106 | 107 | - 使用 `alias` 來建立常用命令的快捷形式。例如:`alias ll='ls -latr'` 使你可以方便地執行`ls -latr`命令。 108 | 109 | - 在 Bash 指令碼中,使用 `set -x` 去偵錯輸出,儘可能的使用嚴格模式,使用 `set -e` 令指令碼在發生錯誤時退出而不是繼續執行,使用 `set -u` 來檢查是否使用了未賦值的變數,使用 `set -o pipefail` 嚴謹地對待錯誤 (儘管問題可能很微妙)。當牽扯到很多指令碼時,使用 `trap`。一個好的習慣是在指令碼檔案開頭這樣寫,這會使它檢測一些錯誤,並在錯誤發生時中斷程式並輸出資訊: 110 | 111 | ```bash 112 | set -euo pipefail 113 | trap "echo 'error: Script failed: see failed command above'" ERR 114 | ``` 115 | 116 | - 在 Bash 指令碼中,子 shell (使用括號 `(...)`) 是一種組織參數的便捷方式。一個常見的例子是臨時地移動工作路徑,程式碼如下: 117 | 118 | ```bash 119 | # do something in current dir 120 | (cd /some/other/dir && other-command) 121 | # continue in original dir 122 | ``` 123 | 124 | - 在 Bash 中,要注意其中有許多形式的擴充套件。檢查變數是否存在:`${name:?error message}`。例如,當 Bash 指令碼需要一個參數時,可以使用這樣的程式碼 `input_file=${1:?usage: $0 input_file}`。數學表示式:`i=$(( (i + 1) % 5 ))`。序列:`{1..10}`。截斷字元串:`${var%suffix}` 和 `${var#prefix}`。例如,假設 `var=foo.pdf`,那麼 `echo ${var%.pdf}.txt` 將輸出 `foo.txt`。 125 | 126 | - 使用括號擴充套件 (`{`...`}`) 來減少輸入相似文字,並自動化文字組合。這在某些情況下會很有用,例如 `mv foo.{txt,pdf} some-dir` (同時移動兩個檔案),`cp somefile{,.bak}` (會被擴充套件成 `cp somefile somefile.bak`) 或者 `mkdir -p test-{a,b,c}/subtest-{1,2,3}` (會被擴充套件成所有可能的組合,並建立一個目錄樹)。 127 | 128 | - 通過使用 `<(some command)` 可以將輸出視為檔案。例如,對比本地檔案 `/etc/hosts` 和一個遠端檔案: 129 | 130 | ```sh 131 | diff /etc/hosts <(ssh somehost cat /etc/hosts) 132 | ``` 133 | 134 | - 瞭解 Bash 中的 “here documents”,例如 `cat < logfile 2>&1`。通常,為了保證命令不會在標準輸入裡殘留一個打開了的檔案控制代碼導致你當前所在的終端無法操作,新增 ` bar: 217 | repren --full --preserve-case --from foo --to bar . 218 | # Recover backup files whatever.bak -> whatever: 219 | repren --renames --from '(.*)\.bak' --to '\1' *.bak 220 | # Same as above, using rename, if available: 221 | rename 's/\.bak$//' *.bak 222 | ``` 223 | 224 | - 根據 man 頁面的描述,`rsync` 真的是一個快速且非常靈活的檔案複製工具。它通常被用於機器間的同步,但在本地也同樣有用。它同時也是刪除大量檔案的[最快方法](https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html)之一: 225 | 226 | ```sh 227 | mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir 228 | ``` 229 | 230 | - 使用 `shuf` 從一個檔案中隨機選取多行。 231 | 232 | - 瞭解 `sort` 的參數。處理數字方面,使用 `-n` 或者 `-h` 來處理可讀性數字 (例如 `du -h` 的輸出)。明白鍵的工作原理 (`-t` 和 `-k`)。例如,注意到你需要 `-k1,1` 來僅按第一個域來排序,而 `-k1` 意味著按整行排序。穩定排序 (`sort -s`) 在某些情況下很有用。例如,以第二個域為主關鍵字,第一個域為次關鍵字進行排序,你可以使用 `sort -k1,1 | sort -s -k2,2`。 233 | 234 | - 如果你想在 Bash 命令列中寫 tab 製表符,按下 **ctrl-v** **[Tab]** 或鍵入 `$'\t'` (後者可能更好,因為你可以複製貼上它)。 235 | 236 | - 標準的原始碼對比及合併工具是 `diff` 和 `patch`。使用 `diffstat` 檢視變更總覽資料。注意到 `diff -r` 對整個資料夾有效。使用 `diff -r tree1 tree2 | diffstat` 檢視變更總覽資料。 237 | 238 | - 對於二進位制檔案,使用 `hd` 使其以十六進位制顯示以及使用 `bvi` 來編輯二進位制。 239 | 240 | - 同樣對於二進位制檔案,`strings` (包括 `grep` 等等) 允許你查詢一些文字。 241 | 242 | - 二進位制檔案對比 (Delta 壓縮),使用 `xdelta3`。 243 | 244 | - 使用 `iconv` 更改文字編碼。而更高階的用法,可以使用 `uconv`,它支援一些高階的 Unicode 功能。例如,這條命令將所有母音字母轉為小寫並移除了: 245 | 246 | ```sh 247 | uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt 248 | ``` 249 | 250 | - 拆分檔案,檢視 `split` (按大小拆分) 和 `csplit` (按模式拆分)。 251 | 252 | - 用 [`dateutils`](http://www.fresse.org/dateutils/) 中的 `dateadd`, `datediff`, `strptime` 等工具操作日期和時間表達式。 253 | 254 | - 使用 `zless`,`zmore`,`zcat` 和 `zgrep` 對壓縮過的檔案進行操作。 255 | 256 | 257 | ## 系統偵錯 258 | 259 | - `curl` 和 `curl -I` 可以便捷地被應用於 web 偵錯中,它們的好兄弟 `wget` 也可以,或者是更潮的 [`httpie`](https://github.com/jakubroztocil/httpie)。 260 | 261 | - 使用 `iostat`、`netstat`、`top` (`htop` 更佳) 和 `dstat` 去獲取硬碟、cpu 和網路的狀態。熟練掌握這些工具可以使你快速的對系統的當前狀態有一個大概的認識。 262 | 263 | - 使用 `netstat` 和 `ss` 檢視網路連線的細節。 264 | 265 | - 若要對系統有一個深度的總體認識,使用 [`glances`](https://github.com/nicolargo/glances)。它在一個終端視窗中向你提供一些系統級的資料。這對於快速的檢查各個子系統非常有幫助。 266 | 267 | - 若要了解記憶體狀態,執行並理解 `free` 和 `vmstat` 的輸出。尤其注意 “cached” 的值,它指的是 Linux 核心用來作為檔案快取的記憶體大小,因此它與空閒記憶體無關。 268 | 269 | - Java 系統偵錯則是一件截然不同的事,一個可以用於 Oracle 的 JVM 或其他 JVM 上的偵錯的技巧是你可以執行 `kill -3 ` 同時一個完整的棧軌跡和堆概述 (包括 GC 的細節) 會被儲存到標準輸出/日誌檔案。JDK 中的 `jps`,`jstat`,`jstack`,`jmap` 很有用。[SJK tools](https://github.com/aragozin/jvm-tools) 更高階. 270 | 271 | - 使用 `mtr` 去跟蹤路由,用於確定網路問題。 272 | 273 | - 用 `ncdu` 來檢視磁碟使用情況,它比常用的命令,如 `du -sh *`,更節省時間。 274 | 275 | - 查詢正在使用頻寬的套接字連線或程序,使用 `iftop` 或 `nethogs`。 276 | 277 | - `ab` 工具 (捆綁於 Apache) 可以簡單粗暴地檢查 web 伺服器的效能。對於更復雜的負載測試,使用 `siege`。 278 | 279 | - `wireshark`,`tshark` 和 `ngrep` 可用於複雜的網路偵錯。 280 | 281 | - 瞭解 `strace` 和 `ltrace`。這倆工具在你的程式執行失敗、掛起甚至崩潰,而你卻不知道為什麼或你想對效能有個總體的認識的時候是非常有用的。注意 profile 參數 (`-c`) 和附加到一個執行的程序參數 (`-p`)。 282 | 283 | - 瞭解使用 `ldd` 來檢查共享庫。 284 | 285 | - 瞭解如何運用 `gdb` 連線到一個執行著的程序並獲取它的堆棧軌跡。 286 | 287 | - 學會使用 `/proc`。它在偵錯正在出現的問題的時候有時會效果驚人。比如:`/proc/cpuinfo`,`/proc/meminfo`,`/proc/cmdline`,`/proc/xxx/cwd`,`/proc/xxx/exe`,`/proc/xxx/fd/`,`/proc/xxx/smaps` (這裡的 `xxx` 表示程序的 id 或 pid)。 288 | 289 | - 當偵錯一些之前出現的問題的時候,`sar` 非常有用。它展示了 cpu、記憶體以及網路等的歷史資料。 290 | 291 | - 關於更深層次的系統分析以及效能分析,看看 `stap` ([SystemTap](https://sourceware.org/systemtap/wiki)),[`perf`](http://en.wikipedia.org/wiki/Perf_(Linux)),以及[`sysdig`](https://github.com/draios/sysdig)。 292 | 293 | - 檢視你當前使用的系統,使用 `uname`, `uname -a` (Unix/kernel 資訊) 或者 `lsb_release -a` (Linux 發行版資訊)。 294 | 295 | - 無論什麼東西工作得很歡樂時試試 `dmesg` (可能是硬體或驅動問題)。 296 | 297 | 298 | ## 單行指令碼 299 | 300 | 一些命令組合的例子: 301 | 302 | - 當你需要對文字檔案做集合交、並、差運算時,結合使用 `sort`/`uniq` 很有幫助。假設 `a` 與 `b` 是兩內容不同的檔案。這種方式效率很高,並且在小檔案和上G的檔案上都能運用 (`sort` 不被記憶體大小約束,儘管在 `/tmp` 在一個小的根分區上時你可能需要 `-T` 參數),參閱前文中關於 `LC_ALL` 和 `sort` 的 `-u` 參數的部分。 303 | 304 | ```sh 305 | cat a b | sort | uniq > c # c is a union b 306 | cat a b | sort | uniq -d > c # c is a intersect b 307 | cat a b b | sort | uniq -u > c # c is set difference a - b 308 | ``` 309 | 310 | - 使用 `grep . *` (每行都會附上檔名) 或者 `head -100 *` (每個檔案有一個標題) 來閱讀檢查目錄下所有檔案的內容。這在檢查一個充滿配置檔案的目錄 (如 `/sys`、`/proc`、`/etc`) 時特別好用。 311 | 312 | - 計算文字檔案第三列中所有數的和 (可能比同等作用的 Python 程式碼快三倍且程式碼量少三倍): 313 | 314 | ```sh 315 | awk '{ x += $3 } END { print x }' myfile 316 | ``` 317 | 318 | - 如果你想在檔案樹上檢視大小/日期,這可能看起來像遞迴版的 `ls -l` 但比 `ls -lR` 更易於理解: 319 | 320 | ```sh 321 | find . -type f -ls 322 | ``` 323 | 324 | - 假設你有一個類似於 web 伺服器日誌檔案的文字檔案,並且一個確定的值只會出現在某些行上,假設一個 `acct_id` 參數在URI中。如果你想計算出每個 `acct_id` 值有多少次請求,使用如下程式碼: 325 | 326 | ```sh 327 | cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn 328 | ``` 329 | 330 | - 執行這個函數從這篇文件中隨機獲取一條技巧 (解析 Markdown 檔案並抽取項目): 331 | 332 | ```sh 333 | function taocl() { 334 | curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md | 335 | pandoc -f markdown -t html | 336 | xmlstarlet fo --html --dropdtd | 337 | xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" | 338 | xmlstarlet unesc | fmt -80 339 | } 340 | ``` 341 | 342 | 343 | ## 冷門但實用 344 | 345 | - `expr`:計算表示式或正則匹配 346 | 347 | - `m4`:簡單地宏處理器 348 | 349 | - `yes`:多次列印字元串 350 | 351 | - `cal`:漂亮的日曆 352 | 353 | - `env`:執行一個命令 (指令碼檔案中很有用) 354 | 355 | - `printenv`:列印環境變數 (偵錯時或在使用指令碼檔案時很有用) 356 | 357 | - `look`:查詢以特定字元串開頭的單詞 358 | 359 | - `cut`、`paste` 和 `join`:資料修改 360 | 361 | - `fmt`:格式化文字段落 362 | 363 | - `pr`:將文字格式化成頁/列形式 364 | 365 | - `fold`:包裹文字中的幾行 366 | 367 | - `column`:將文字格式化成多列或表格 368 | 369 | - `expand` 和 `unexpand`:製表符與空格之間轉換 370 | 371 | - `nl`:新增行號 372 | 373 | - `seq`:列印數字 374 | 375 | - `bc`:計算器 376 | 377 | - `factor`:分解因數 378 | 379 | - [`gpg`](https://gnupg.org/):加密並簽名檔案 380 | 381 | - `toe`:terminfo entries 列表 382 | 383 | - `nc`:網路偵錯及資料傳輸 384 | 385 | - `socat`:套接字代理,與 `netcat` 類似 386 | 387 | - [`slurm`](https://github.com/mattthias/slurm):網路視覺化 388 | 389 | - `dd`:檔案或裝置間傳輸資料 390 | 391 | - `file`:確定檔案類型 392 | 393 | - `tree`:以樹的形式顯示路徑和檔案,類似於遞迴的 `ls` 394 | 395 | - `stat`:檔案資訊 396 | 397 | - `time`:執行命令,並計算執行時間 398 | 399 | - `lockfile`:使檔案只能通過 `rm -f` 移除 400 | 401 | - `logrotate`: 切換、壓縮以及傳送日誌檔案 402 | 403 | - `watch`:重複運行同一個命令,展示結果並高亮有更改的部分 404 | 405 | - `tac`:反向輸出檔案 406 | 407 | - `shuf`:檔案中隨機選取幾行 408 | 409 | - `comm`:一行一行的比較排序過的檔案 410 | 411 | - `pv`:監視通過管道的資料 412 | 413 | - `hd`,`hexdump`,`xxd`,`biew` 和 `bvi`:儲存或編輯二進位制檔案 414 | 415 | - `strings`:從二進位制檔案中抽取文字 416 | 417 | - `tr`:轉換字母 418 | 419 | - `iconv` 或 `uconv`:簡易的檔案編碼 420 | 421 | - `split` 和 `csplit`:分割檔案 422 | 423 | - `sponge`:在寫入前讀取所有輸入,在讀取檔案後再向同一檔案寫入時比較有用,例如 `grep -v something some-file | sponge some-file` 424 | 425 | - `units`:將一種計量單位轉換為另一種等效的計量單位 (參閱 `/usr/share/units/definitions.units`) 426 | 427 | - `apg`:隨機生成密碼 428 | 429 | - `7z`:高比例的檔案壓縮 430 | 431 | - `ldd`:動態庫資訊 432 | 433 | - `nm`:提取 obj 檔案中的符號 434 | 435 | - `ab`:效能分析 web 伺服器 436 | 437 | - `strace`:系統呼叫偵錯 438 | 439 | - `mtr`:更好的網路偵錯跟蹤工具 440 | 441 | - `cssh`:視覺化的併發 shell 442 | 443 | - `rsync`:通過 ssh 或本地檔案系統同步檔案和資料夾 444 | 445 | - `wireshark` 和 `tshark`:抓封包和網路偵錯工具 446 | 447 | - `ngrep`:網路層的 grep 448 | 449 | - `host` 和 `dig`:DNS 查詢 450 | 451 | - `lsof`:列出當前系統開啟檔案的工具以及檢視埠資訊 452 | 453 | - `dstat`:系統狀態檢視 454 | 455 | - [`glances`](https://github.com/nicolargo/glances):高層次的多子系統總覽 456 | 457 | - `iostat`:硬碟使用狀態 458 | 459 | - `mpstat`: CPU 使用狀態 460 | 461 | - `vmstat`: 記憶體使用狀態 462 | 463 | - `htop`:top 的加強版 464 | 465 | - `last`:登入記錄 466 | 467 | - `w`:檢視處於登入狀態的使用者 468 | 469 | - `id`:使用者/組 ID 資訊 470 | 471 | - `sar`:系統歷史資料 472 | 473 | - `iftop` 或 `nethogs`:套接字及程序的網路利用 474 | 475 | - `ss`:套接字資料 476 | 477 | - `dmesg`:引導及系統錯誤資訊 478 | 479 | - `sysctl`: 在核心執行時動態地檢視和修改核心的執行參數 480 | 481 | - `hdparm`:SATA/ATA 磁碟更改及效能分析 482 | 483 | - `lsb_release`:Linux 發行版資訊 484 | 485 | - `lsblk`:列出塊裝置資訊:以樹形展示你的磁碟以及磁碟分區資訊 486 | 487 | - `lshw`,`lscpu`,`lspci`,`lsusb` 和 `dmidecode`:檢視硬體資訊,包括 CPU、BIOS、RAID、顯示卡、USB裝置等 488 | 489 | - `lsmod` 和 `modinfo`:列出核心模組,並顯示其細節 490 | 491 | - `fortune`,`ddate` 和 `sl`:額,這主要取決於你是否認為蒸汽火車和莫名其妙的名人名言是否“有用” 492 | 493 | ## 僅限 MacOS X 系統 494 | 495 | 以下是*僅限於* MacOS 系統的技巧 496 | 497 | - 用 `brew` (Homebrew) 或者 `port` (MacPorts) 進行套件管理。這些可以用來在 Mac 系統上安裝以上的大多數命令。 498 | 499 | - 用 `pbcopy` 複製任何命令的輸出到桌面應用,用 `pbpaste` 貼上輸入。 500 | 501 | - 若要在 Mac OS 終端中將 Option 鍵視為 alt 鍵 (例如在上面介紹的 **alt-b**, **alt-f** 等命令中用到),開啟 偏好設定 -> 描述檔案 -> 鍵盤 並勾選 “使用 Option 鍵作為 Meta 鍵”。 502 | 503 | - 用 `open` 或者 `open -a /Applications/Whatever.app` 使用桌面應用開啟檔案。 504 | 505 | - Spotlight:用 `mdfind` 搜尋檔案,用 `mdls` 列出元資料 (例如照片的 EXIF 資訊)。 506 | 507 | - 注意 MacOS 系統是基於 BSD UNIX 的,許多命令 (例如 `ps`,`ls`,`tail`,`awk`,`sed`) 都和 Linux 中有些微的不同,這些極大的被 System V-style Unix 和 GNU 工具影響。你可以通過標題為 "BSD General Commands Manual" 的 man 頁面發現這些不同。在有些情況下 GNU 版本的命令也可能被安裝 (例如 `gawk` 和 `gsed` 對應 GNU 中的 awk 和 sed )。如果要寫跨平臺的 Bash 指令碼,避免使用這些命令 (例如,考慮 Python 或者 `perl`) 或者經過仔細的測試。 508 | 509 | - 用 `sw_vers` 獲取 MacOS 的版本資訊。 510 | 511 | 512 | ## 更多資源 513 | 514 | - [awesome-shell](https://github.com/alebcay/awesome-shell):一份精心組織的命令列工具及資源的列表。 515 | - [awesome-osx-command-line](https://github.com/herrbischoff/awesome-osx-command-line):一份針對 Mac OS 命令列的更深入的指南。 516 | - [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/):為了編寫更好的指令碼檔案。 517 | - [shellcheck](https://github.com/koalaman/shellcheck):一個靜態 shell 指令碼分析工具,本質上是 bash/sh/zsh 的 lint。 518 | - [Filenames and Pathnames in Shell](http://www.dwheeler.com/essays/filenames-in-shell.html):有關如何在 shell 腳本里正確處理檔名的細枝末節。 519 | 520 | 521 | ## 免責聲明 522 | 523 | 除去特別微小的任務,編寫程式碼是出於方便閱讀的目的。能力往往伴隨著責任。你 *可以* 在 Bash 中做一些事並不意味著你應該去做!;) 524 | 525 | 526 | ## 授權條款 527 | 528 | [![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) 529 | 530 | 本文使用授權協議 [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/)。 531 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [ Languages: 2 | [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-cn.md), [繁體中文](README-zh-tw.md) 3 | ] 4 | 5 | 6 | # The Art of Command Line 7 | 8 | [![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) 9 | 10 | - [Meta](#meta) 11 | - [Basics](#basics) 12 | - [Everyday use](#everyday-use) 13 | - [Processing files and data](#processing-files-and-data) 14 | - [System debugging](#system-debugging) 15 | - [One-liners](#one-liners) 16 | - [Obscure but useful](#obscure-but-useful) 17 | - [MacOS X only](#macos-x-only) 18 | - [More resources](#more-resources) 19 | - [Disclaimer](#disclaimer) 20 | 21 | 22 | ![curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '`\w+`' | tr -d '`' | cowsay -W50](cowsay.png) 23 | 24 | Fluency on the command line is a skill often neglected or considered arcane, but it improves your flexibility and productivity as an engineer in both obvious and subtle ways. This is a selection of notes and tips on using the command-line that we've found useful when working on Linux. Some tips are elementary, and some are fairly specific, sophisticated, or obscure. This page is not long, but if you can use and recall all the items here, you know a lot. 25 | 26 | This work is the result of [many authors and translators](AUTHORS.md). 27 | Much of this 28 | [originally](http://www.quora.com/What-are-some-lesser-known-but-useful-Unix-commands) 29 | [appeared](http://www.quora.com/What-are-the-most-useful-Swiss-army-knife-one-liners-on-Unix) 30 | on [Quora](http://www.quora.com/What-are-some-time-saving-tips-that-every-Linux-user-should-know), 31 | but given the interest there, it seemed worth using GitHub, where people more talented than the original author could readily suggest improvements. If you see an error or something that could be better, please submit an issue or PR! (Of course please review the meta section and existing PRs/issues first.) 32 | 33 | 34 | ## Meta 35 | 36 | Scope: 37 | 38 | - This guide is both for beginners and the experienced. The goals are *breadth* (everything important), *specificity* (give concrete examples of the most common case), and *brevity* (avoid things that aren't essential or digressions you can easily look up elsewhere). Every tip is essential in some situation or significantly saves time over alternatives. 39 | - This is written for Linux, with the exception of the "[MacOS X only](#macos-x-only)" section. Many of the other items apply or can be installed on other Unices or MacOS (or even Cygwin). 40 | - The focus is on interactive Bash, though many tips apply to other shells and to general Bash scripting. 41 | - It includes both "standard" Unix commands as well as ones that require special package installs -- so long as they are important enough to merit inclusion. 42 | 43 | Notes: 44 | 45 | - To keep this to one page, content is implicitly included by reference. You're smart enough to look up more detail elsewhere once you know the idea or command to Google. Use `apt-get`/`yum`/`dnf`/`pacman`/`pip`/`brew` (as appropriate) to install new programs. 46 | - Use [Explainshell](http://explainshell.com/) to get a helpful breakdown of what commands, options, pipes etc. do. 47 | 48 | 49 | ## Basics 50 | 51 | - Learn basic Bash. Actually, type `man bash` and at least skim the whole thing; it's pretty easy to follow and not that long. Alternate shells can be nice, but Bash is powerful and always available (learning *only* zsh, fish, etc., while tempting on your own laptop, restricts you in many situations, such as using existing servers). 52 | 53 | - Learn at least one text-based editor well. Ideally Vim (`vi`), as there's really no competition for random editing in a terminal (even if you use Emacs, a big IDE, or a modern hipster editor most of the time). 54 | 55 | - Know how to read documentation with `man` (for the inquisitive, `man man` lists the section numbers, e.g. 1 is "regular" commands, 5 is files/conventions, and 8 are for administration). Find man pages with `apropos`. Know that some commands are not executables, but Bash builtins, and that you can get help on them with `help` and `help -d`. 56 | 57 | - Learn about redirection of output and input using `>` and `<` and pipes using `|`. Know `>` overwrites the output file and `>>` appends. Learn about stdout and stderr. 58 | 59 | - Learn about file glob expansion with `*` (and perhaps `?` and `[`...`]`) and quoting and the difference between double `"` and single `'` quotes. (See more on variable expansion below.) 60 | 61 | - Be familiar with Bash job management: `&`, **ctrl-z**, **ctrl-c**, `jobs`, `fg`, `bg`, `kill`, etc. 62 | 63 | - Know `ssh`, and the basics of passwordless authentication, via `ssh-agent`, `ssh-add`, etc. 64 | 65 | - Basic file management: `ls` and `ls -l` (in particular, learn what every column in `ls -l` means), `less`, `head`, `tail` and `tail -f` (or even better, `less +F`), `ln` and `ln -s` (learn the differences and advantages of hard versus soft links), `chown`, `chmod`, `du` (for a quick summary of disk usage: `du -hs *`). For filesystem management, `df`, `mount`, `fdisk`, `mkfs`, `lsblk`. Learn what an inode is (`ls -i` or `df -i`). 66 | 67 | - Basic network management: `ip` or `ifconfig`, `dig`. 68 | 69 | - Know regular expressions well, and the various flags to `grep`/`egrep`. The `-i`, `-o`, `-v`, `-A`, `-B`, and `-C` options are worth knowing. 70 | 71 | - Learn to use `apt-get`, `yum`, `dnf` or `pacman` (depending on distro) to find and install packages. And make sure you have `pip` to install Python-based command-line tools (a few below are easiest to install via `pip`). 72 | 73 | 74 | ## Everyday use 75 | 76 | - In Bash, use **Tab** to complete arguments or list all available commands and **ctrl-r** to search through command history (after pressing, type to search, press **ctrl-r** repeatedly to cycle through more matches, press **Enter** to execute the found command, or hit the right arrow to put the result in the current line to allow editing). 77 | 78 | - In Bash, use **ctrl-w** to delete the last word, and **ctrl-u** to delete all the way back to the start of the line. Use **alt-b** and **alt-f** to move by word, **ctrl-a** to move cursor to beginning of line, **ctrl-e** to move cursor to end of line, **ctrl-k** to kill to the end of the line, **ctrl-l** to clear the screen. See `man readline` for all the default keybindings in Bash. There are a lot. For example **alt-.** cycles through previous arguments, and **alt-*** expands a glob. 79 | 80 | 81 | - Alternatively, if you love vi-style key-bindings, use `set -o vi` (and `set -o emacs` to put it back). 82 | 83 | - For editing long commands, after setting your editor (for example `export EDITOR=vim`), **ctrl-x** **ctrl-e** will open the current command in an editor for multi-line editing. Or in vi style, **escape-v**. 84 | 85 | - To see recent commands, `history`. There are also many abbreviations such as `!$` (last argument) and `!!` last command, though these are often easily replaced with **ctrl-r** and **alt-.**. 86 | 87 | - To go back to the previous working directory: `cd -` 88 | 89 | - If you are halfway through typing a command but change your mind, hit **alt-#** to add a `#` at the beginning and enter it as a comment (or use **ctrl-a**, **#**, **enter**). You can then return to it later via command history. 90 | 91 | - Use `xargs` (or `parallel`). It's very powerful. Note you can control how many items execute per line (`-L`) as well as parallelism (`-P`). If you're not sure if it'll do the right thing, use `xargs echo` first. Also, `-I{}` is handy. Examples: 92 | ```bash 93 | find . -name '*.py' | xargs grep some_function 94 | cat hosts | xargs -I{} ssh root@{} hostname 95 | ``` 96 | 97 | - `pstree -p` is a helpful display of the process tree. 98 | 99 | - Use `pgrep` and `pkill` to find or signal processes by name (`-f` is helpful). 100 | 101 | - Know the various signals you can send processes. For example, to suspend a process, use `kill -STOP [pid]`. For the full list, see `man 7 signal` 102 | 103 | - Use `nohup` or `disown` if you want a background process to keep running forever. 104 | 105 | - Check what processes are listening via `netstat -lntp` or `ss -plat` (for TCP; add `-u` for UDP). 106 | 107 | - See also `lsof` for open sockets and files. 108 | 109 | - See `uptime` or `w` to know the how long the system has been running. 110 | 111 | - Use `alias` to create shortcuts for commonly used commands. For example, `alias ll='ls -latr'` creates a new alias `ll`. 112 | 113 | - In Bash scripts, use `set -x` (or the variant `set -v`, which logs raw input, including unexpanded variables and comments) for debugging output. Use strict modes unless you have a good reason not to: Use `set -e` to abort on errors (nonzero exit code). Use `set -u` to detect unset variable usages. Consider `set -o pipefail` too, to on errors within pipes, too (though read up on it more if you do, as this topic is a bit subtle). For more involved scripts, also use `trap` on EXIT or ERR. A useful habit is to start a script like this, which will make it detect and abort on common errors and print a message: 114 | ```bash 115 | set -euo pipefail 116 | trap "echo 'error: Script failed: see failed command above'" ERR 117 | ``` 118 | 119 | - In Bash scripts, subshells (written with parentheses) are convenient ways to group commands. A common example is to temporarily move to a different working directory, e.g. 120 | ```bash 121 | # do something in current dir 122 | (cd /some/other/dir && other-command) 123 | # continue in original dir 124 | ``` 125 | 126 | - In Bash, note there are lots of kinds of variable expansion. Checking a variable exists: `${name:?error message}`. For example, if a Bash script requires a single argument, just write `input_file=${1:?usage: $0 input_file}`. Arithmetic expansion: `i=$(( (i + 1) % 5 ))`. Sequences: `{1..10}`. Trimming of strings: `${var%suffix}` and `${var#prefix}`. For example if `var=foo.pdf`, then `echo ${var%.pdf}.txt` prints `foo.txt`. 127 | 128 | - Brace expansion using `{`...`}` can reduce having to re-type similar text and automate combinations of items. This is helpful in examples like `mv foo.{txt,pdf} some-dir` (which moves both files), `cp somefile{,.bak}` (which expands to `cp somefile somefile.bak`) or `mkdir -p test-{a,b,c}/subtest-{1,2,3}` (which expands all possible combinations and creates a directory tree). 129 | 130 | - The output of a command can be treated like a file via `<(some command)`. For example, compare local `/etc/hosts` with a remote one: 131 | ```sh 132 | diff /etc/hosts <(ssh somehost cat /etc/hosts) 133 | ``` 134 | 135 | - Know about "here documents" in Bash, as in `cat <logfile 2>&1` or `some-command &>logfile`. Often, to ensure a command does not leave an open file handle to standard input, tying it to the terminal you are in, it is also good practice to add ` bar: 215 | repren --full --preserve-case --from foo --to bar . 216 | # Recover backup files whatever.bak -> whatever: 217 | repren --renames --from '(.*)\.bak' --to '\1' *.bak 218 | # Same as above, using rename, if available: 219 | rename 's/\.bak$//' *.bak 220 | ``` 221 | 222 | - As the man page says, `rsync` really is a fast and extraordinarily versatile file copying tool. It's known for synchronizing between machines but is equally useful locally. It also is among the [fastest ways](https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html) to delete large numbers of files: 223 | ```sh 224 | mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir 225 | ``` 226 | 227 | - Use `shuf` to shuffle or select random lines from a file. 228 | 229 | - Know `sort`'s options. For numbers, use `-n`, or `-h` for handling human-readable numbers (e.g. from `du -h`). Know how keys work (`-t` and `-k`). In particular, watch out that you need to write `-k1,1` to sort by only the first field; `-k1` means sort according to the whole line. Stable sort (`sort -s`) can be useful. For example, to sort first by field 2, then secondarily by field 1, you can use `sort -k1,1 | sort -s -k2,2`. 230 | 231 | - If you ever need to write a tab literal in a command line in Bash (e.g. for the -t argument to sort), press **ctrl-v** **[Tab]** or write `$'\t'` (the latter is better as you can copy/paste it). 232 | 233 | - The standard tools for patching source code are `diff` and `patch`. See also `diffstat` for summary statistics of a diff and `sdiff` for a side-by-side diff. Note `diff -r` works for entire directories. Use `diff -r tree1 tree2 | diffstat` for a summary of changes. Use `vimdiff` to compare and edit files. 234 | 235 | - For binary files, use `hd`, `hexdump` or `xxd` for simple hex dumps and `bvi` or `biew` for binary editing. 236 | 237 | - Also for binary files, `strings` (plus `grep`, etc.) lets you find bits of text. 238 | 239 | - For binary diffs (delta compression), use `xdelta3`. 240 | 241 | - To convert text encodings, try `iconv`. Or `uconv` for more advanced use; it supports some advanced Unicode things. For example, this command lowercases and removes all accents (by expanding and dropping them): 242 | ```sh 243 | uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt 244 | ``` 245 | 246 | - To split files into pieces, see `split` (to split by size) and `csplit` (to split by a pattern). 247 | 248 | - To manipulate date and time expressions, use `dateadd`, `datediff`, `strptime` etc. from [`dateutils`](http://www.fresse.org/dateutils/). 249 | 250 | - Use `zless`, `zmore`, `zcat`, and `zgrep` to operate on compressed files. 251 | 252 | 253 | ## System debugging 254 | 255 | - For web debugging, `curl` and `curl -I` are handy, or their `wget` equivalents, or the more modern [`httpie`](https://github.com/jkbrzt/httpie). 256 | 257 | - To know current cpu/disk status, the classic tools are `top` (or the better `htop`), `iostat`, and `iotop`. Use `iostat -mxz 15` for basic CPU and detailed per-partition disk stats and performance insight. 258 | 259 | - For network connection details, use `netstat` and `ss`. 260 | 261 | - For a quick overview of what's happening on a system, `dstat` is especially useful. For broadest overview with details, use [`glances`](https://github.com/nicolargo/glances). 262 | 263 | - To know memory status, run and understand the output of `free` and `vmstat`. In particular, be aware the "cached" value is memory held by the Linux kernel as file cache, so effectively counts toward the "free" value. 264 | 265 | - Java system debugging is a different kettle of fish, but a simple trick on Oracle's and some other JVMs is that you can run `kill -3 ` and a full stack trace and heap summary (including generational garbage collection details, which can be highly informative) will be dumped to stderr/logs. The JDK's `jps`, `jstat`, `jstack`, `jmap` are useful. [SJK tools](https://github.com/aragozin/jvm-tools) are more advanced. 266 | 267 | - Use `mtr` as a better traceroute, to identify network issues. 268 | 269 | - For looking at why a disk is full, `ncdu` saves time over the usual commands like `du -sh *`. 270 | 271 | - To find which socket or process is using bandwidth, try `iftop` or `nethogs`. 272 | 273 | - The `ab` tool (comes with Apache) is helpful for quick-and-dirty checking of web server performance. For more complex load testing, try `siege`. 274 | 275 | - For more serious network debugging, `wireshark`, `tshark`, or `ngrep`. 276 | 277 | - Know about `strace` and `ltrace`. These can be helpful if a program is failing, hanging, or crashing, and you don't know why, or if you want to get a general idea of performance. Note the profiling option (`-c`), and the ability to attach to a running process (`-p`). 278 | 279 | - Know about `ldd` to check shared libraries etc. 280 | 281 | - Know how to connect to a running process with `gdb` and get its stack traces. 282 | 283 | - Use `/proc`. It's amazingly helpful sometimes when debugging live problems. Examples: `/proc/cpuinfo`, `/proc/meminfo`, `/proc/cmdline`, `/proc/xxx/cwd`, `/proc/xxx/exe`, `/proc/xxx/fd/`, `/proc/xxx/smaps` (where `xxx` is the process id or pid). 284 | 285 | - When debugging why something went wrong in the past, `sar` can be very helpful. It shows historic statistics on CPU, memory, network, etc. 286 | 287 | - For deeper systems and performance analyses, look at `stap` ([SystemTap](https://sourceware.org/systemtap/wiki)), [`perf`](https://en.wikipedia.org/wiki/Perf_(Linux)), and [`sysdig`](https://github.com/draios/sysdig). 288 | 289 | - Check what OS you're on with `uname` or `uname -a` (general Unix/kernel info) or `lsb_release -a` (Linux distro info). 290 | 291 | - Use `dmesg` whenever something's acting really funny (it could be hardware or driver issues). 292 | 293 | 294 | ## One-liners 295 | 296 | A few examples of piecing together commands: 297 | 298 | - It is remarkably helpful sometimes that you can do set intersection, union, and difference of text files via `sort`/`uniq`. Suppose `a` and `b` are text files that are already uniqued. This is fast, and works on files of arbitrary size, up to many gigabytes. (Sort is not limited by memory, though you may need to use the `-T` option if `/tmp` is on a small root partition.) See also the note about `LC_ALL` above and `sort`'s `-u` option (left out for clarity below). 299 | ```sh 300 | cat a b | sort | uniq > c # c is a union b 301 | cat a b | sort | uniq -d > c # c is a intersect b 302 | cat a b b | sort | uniq -u > c # c is set difference a - b 303 | ``` 304 | 305 | - Use `grep . *` to quickly examine the contents of all files in a directory (so each line is paired with the filename), or `head -100 *` (so each file has a heading). This can be useful for directories filled with config settings like those in `/sys`, `/proc`, `/etc`. 306 | 307 | 308 | - Summing all numbers in the third column of a text file (this is probably 3X faster and 3X less code than equivalent Python): 309 | ```sh 310 | awk '{ x += $3 } END { print x }' myfile 311 | ``` 312 | 313 | - If want to see sizes/dates on a tree of files, this is like a recursive `ls -l` but is easier to read than `ls -lR`: 314 | ```sh 315 | find . -type f -ls 316 | ``` 317 | 318 | - Say you have a text file, like a web server log, and a certain value that appears on some lines, such as an `acct_id` parameter that is present in the URL. If you want a tally of how many requests for each `acct_id`: 319 | ```sh 320 | cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn 321 | ``` 322 | 323 | - To continuously monitor changes, use `watch`, e.g. check changes to files in a directory with `watch -d -n 2 'ls -rtlh | tail'` or to network settings while troubleshooting your wifi settings with `watch -d -n 2 ifconfig`. 324 | 325 | - Run this function to get a random tip from this document (parses Markdown and extracts an item): 326 | ```sh 327 | function taocl() { 328 | curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md | 329 | pandoc -f markdown -t html | 330 | xmlstarlet fo --html --dropdtd | 331 | xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" | 332 | xmlstarlet unesc | fmt -80 333 | } 334 | ``` 335 | 336 | 337 | ## Obscure but useful 338 | 339 | - `expr`: perform arithmetic or boolean operations or evaluate regular expressions 340 | 341 | - `m4`: simple macro processor 342 | 343 | - `yes`: print a string a lot 344 | 345 | - `cal`: nice calendar 346 | 347 | - `env`: run a command (useful in scripts) 348 | 349 | - `printenv`: print out environment variables (useful in debugging and scripts) 350 | 351 | - `look`: find English words (or lines in a file) beginning with a string 352 | 353 | - `cut`, `paste` and `join`: data manipulation 354 | 355 | - `fmt`: format text paragraphs 356 | 357 | - `pr`: format text into pages/columns 358 | 359 | - `fold`: wrap lines of text 360 | 361 | - `column`: format text fields into aligned, fixed-width columns or tables 362 | 363 | - `expand` and `unexpand`: convert between tabs and spaces 364 | 365 | - `nl`: add line numbers 366 | 367 | - `seq`: print numbers 368 | 369 | - `bc`: calculator 370 | 371 | - `factor`: factor integers 372 | 373 | - [`gpg`](https://gnupg.org/): encrypt and sign files 374 | 375 | - `toe`: table of terminfo entries 376 | 377 | - `nc`: network debugging and data transfer 378 | 379 | - `socat`: socket relay and tcp port forwarder (similar to `netcat`) 380 | 381 | - [`slurm`](https://github.com/mattthias/slurm): network traffic visualization 382 | 383 | - `dd`: moving data between files or devices 384 | 385 | - `file`: identify type of a file 386 | 387 | - `tree`: display directories and subdirectories as a nesting tree; like `ls` but recursive 388 | 389 | - `stat`: file info 390 | 391 | - `time`: execute and time a command 392 | 393 | - `timeout`: execute a command for specified amount of time and stop the process when the specified amount of time completes. 394 | 395 | - `lockfile`: create semaphore file that can only be removed by `rm -f` 396 | 397 | - `logrotate`: rotate, compress and mail logs. 398 | 399 | - `watch`: run a command repeatedly, showing results and/or highlighting changes 400 | 401 | - `tac`: print files in reverse 402 | 403 | - `shuf`: random selection of lines from a file 404 | 405 | - `comm`: compare sorted files line by line 406 | 407 | - `pv`: monitor the progress of data through a pipe 408 | 409 | - `hd`, `hexdump`, `xxd`, `biew` and `bvi`: dump or edit binary files 410 | 411 | - `strings`: extract text from binary files 412 | 413 | - `tr`: character translation or manipulation 414 | 415 | - `iconv` or `uconv`: conversion for text encodings 416 | 417 | - `split` and `csplit`: splitting files 418 | 419 | - `sponge`: read all input before writing it, useful for reading from then writing to the same file, e.g., `grep -v something some-file | sponge some-file` 420 | 421 | - `units`: unit conversions and calculations; converts furlongs per fortnight to twips per blink (see also `/usr/share/units/definitions.units`) 422 | 423 | - `apg`: generates random passwords 424 | 425 | - `7z`: high-ratio file compression 426 | 427 | - `ldd`: dynamic library info 428 | 429 | - `nm`: symbols from object files 430 | 431 | - `ab`: benchmarking web servers 432 | 433 | - `strace`: system call debugging 434 | 435 | - `mtr`: better traceroute for network debugging 436 | 437 | - `cssh`: visual concurrent shell 438 | 439 | - `rsync`: sync files and folders over SSH or in local file system 440 | 441 | - `wireshark` and `tshark`: packet capture and network debugging 442 | 443 | - `ngrep`: grep for the network layer 444 | 445 | - `host` and `dig`: DNS lookups 446 | 447 | - `lsof`: process file descriptor and socket info 448 | 449 | - `dstat`: useful system stats 450 | 451 | - [`glances`](https://github.com/nicolargo/glances): high level, multi-subsystem overview 452 | 453 | - `iostat`: Disk usage stats 454 | 455 | - `mpstat`: CPU usage stats 456 | 457 | - `vmstat`: Memory usage stats 458 | 459 | - `htop`: improved version of top 460 | 461 | - `last`: login history 462 | 463 | - `w`: who's logged on 464 | 465 | - `id`: user/group identity info 466 | 467 | - `sar`: historic system stats 468 | 469 | - `iftop` or `nethogs`: network utilization by socket or process 470 | 471 | - `ss`: socket statistics 472 | 473 | - `dmesg`: boot and system error messages 474 | 475 | - `sysctl`: view and configure Linux kernel parameters at run time 476 | 477 | - `hdparm`: SATA/ATA disk manipulation/performance 478 | 479 | - `lsb_release`: Linux distribution info 480 | 481 | - `lsblk`: list block devices: a tree view of your disks and disk paritions 482 | 483 | - `lshw`, `lscpu`, `lspci`, `lsusb`, `dmidecode`: hardware information, including CPU, BIOS, RAID, graphics, devices, etc. 484 | 485 | - `lsmod` and `modinfo`: List and show details of kernel modules. 486 | 487 | - `fortune`, `ddate`, and `sl`: um, well, it depends on whether you consider steam locomotives and Zippy quotations "useful" 488 | 489 | 490 | ## MacOS X only 491 | 492 | These are items relevant *only* on MacOS. 493 | 494 | - Package management with `brew` (Homebrew) and/or `port` (MacPorts). These can be used to install on MacOS many of the above commands. 495 | 496 | - Copy output of any command to a desktop app with `pbcopy` and paste input from one with `pbpaste`. 497 | 498 | - To enable the Option key in Mac OS Terminal as an alt key (such as used in the commands above like **alt-b**, **alt-f**, etc.), open Preferences -> Profiles -> Keyboard and select "Use Option as Meta key". 499 | 500 | - To open a file with a desktop app, use `open` or `open -a /Applications/Whatever.app`. 501 | 502 | - Spotlight: Search files with `mdfind` and list metadata (such as photo EXIF info) with `mdls`. 503 | 504 | - Be aware MacOS is based on BSD Unix, and many commands (for example `ps`, `ls`, `tail`, `awk`, `sed`) have many subtle variations from Linux, which is largely influenced by System V-style Unix and GNU tools. You can often tell the difference by noting a man page has the heading "BSD General Commands Manual." In some cases GNU versions can be installed, too (such as `gawk` and `gsed` for GNU awk and sed). If writing cross-platform Bash scripts, avoid such commands (for example, consider Python or `perl`) or test carefully. 505 | 506 | - To get MacOS release information, use `sw_vers`. 507 | 508 | 509 | ## More resources 510 | 511 | - [awesome-shell](https://github.com/alebcay/awesome-shell): A curated list of shell tools and resources. 512 | - [awesome-osx-command-line](https://github.com/herrbischoff/awesome-osx-command-line): A more in-depth guide for the Mac OS command line. 513 | - [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/) for writing better shell scripts. 514 | - [shellcheck](https://github.com/koalaman/shellcheck): A shell script static analysis tool. Essentially, lint for bash/sh/zsh. 515 | - [Filenames and Pathnames in Shell](http://www.dwheeler.com/essays/filenames-in-shell.html): The sadly complex minutiae on how to handle filenames correctly in shell scripts. 516 | 517 | 518 | ## Disclaimer 519 | 520 | With the exception of very small tasks, code is written so others can read it. With power comes responsibility. The fact you *can* do something in Bash doesn't necessarily mean you should! ;) 521 | 522 | 523 | ## License 524 | 525 | [![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/) 526 | 527 | This work is licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/). 528 | -------------------------------------------------------------------------------- /admin/authors-info.yml: -------------------------------------------------------------------------------- 1 | # This file is used to configure the "ghizmo assemble-authors" command. 2 | 3 | header: | 4 | This work is the result of the effort of many people around the world. 5 | Contributors are listed in alphabetical order by GitHub login. 6 | 7 | footer: | 8 | Numbers link to commits/issues. 9 | For simplicity, this file is maintained only in English. 10 | 11 | If you see inaccuracies or omissions, please file an issue, or edit the authors-info.yml file, regenerate, and file a PR. 12 | 13 | exclude: 14 | gitter-badger 15 | 16 | roles: 17 | jlevy: original author and maintainer 18 | ceoaliongroo: translator and maintainer (es) 19 | aaossa: translator (es) 20 | BishopWolf: translator (es) 21 | doublemarket: translator and maintainer (ja) 22 | Ungsik-Yun: translator and maintainer (ko) 23 | Snowcat8436: translator (ko) 24 | ujuc: translator (ko) 25 | hunkim: translator (ko) 26 | niltonvasques : translator and maintainer (pt) 27 | vcvpaiva: translator (pt) 28 | olegberman: translator and maintainer (ru) 29 | spmbt: translator (ru) 30 | osmero: translator (ru) 31 | grigory-rechistov: translator (ru) 32 | kastian: translator (ru) 33 | githubashto: translator (ru) 34 | peterkokot: translator and maintainer (sl) 35 | Psycho7: translator and maintainer (zh) 36 | xuchunyang: translator (zh) 37 | stevenlordiam: translator (zh) 38 | Armour: translator (zh) 39 | stepan0904: translator and maintainer (uk) 40 | francescomalatesta: translator and maintainer (it) 41 | -------------------------------------------------------------------------------- /cowsay.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/chusiang/the-art-of-command-line/daf95b31cdf2d18422df81f8aeafc852285ae644/cowsay.png --------------------------------------------------------------------------------