1
0
mirror of https://github.com/jlevy/the-art-of-command-line.git synced 2024-12-14 10:53:03 +02:00
the-art-of-command-line/README-ja.md
2017-03-30 00:12:44 +09:00

522 lines
39 KiB
Markdown

🌍
*[ČeÅ¡tina](README-cs.md) ∙ [Deutsch](README-de.md) ∙ [ΕλληΜικά](README-el.md) ∙ [English](README.md) ∙ [Español](README-es.md) ∙ [Français](README-fr.md) ∙ [Indonesia](README-id.md) ∙ [Italiano](README-it.md) ∙ [日本語](README-ja.md) ∙ [한국얎](README-ko.md) ∙ [Português](README-pt.md) ∙ [Română](README-ro.md) ∙ [РусскОй](README-ru.md) ∙ [Slovenščina](README-sl.md) ∙ [УкраїМська](README-uk.md) ∙ [简䜓䞭文](README-zh.md) ∙ [繁體䞭文](README-zh-Hant.md)*
# The Art of Command Line
[![Join the chat at https://gitter.im/jlevy/the-art-of-command-line](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jlevy/the-art-of-command-line?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
- [メタ情報](#メタ情報)
- [基本](#基本)
- [日垞的に䜿うもの](#日垞的に䜿うもの)
- [ファむルずデヌタの凊理](#ファむルずデヌタの凊理)
- [システムのデバッグ](#システムのデバッグ)
- [ワンラむナヌ](#ワンラむナヌ)
- [目立たないが䟿利なもの](#目立たないが䟿利なもの)
- [OS X甚のもの](#os-x甚のもの)
- [さらなるリ゜ヌス](#さらなるリ゜ヌス)
- [免責事項](#免責事項)
![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)
コマンドラむンで流れるように操䜜ができるずいうこずは、軜く芋られたり他人から理解されないスキルだずみなされるこずもあるだろう。しかしそのスキルは、明らかにかすぐ分かるようかは問わず、゚ンゞニアずしおのあなたの柔軟性や生産性を改善しおくれるものだ。ここでは、Linuxでコマンドラむンを䜿う䞊で䟿利だず思ったメモやTipsの数々を挙げおみる。あるものは基瀎的だが、非垞に詳しいもの、掗緎されたもの、曖昧なものもある。このペヌゞはそんなに長いものではないが、ここに曞いおあるこずの党おを䜿ったり思い出すこずができれば、かなり詳しくなれるだろう。
このドキュメントは[倚くの執筆者ず翻蚳者](AUTHORS.md)による成果である。ここに曞いおあるこずの倚くは、[元々](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に眮くのがよいのではず思った。間違いやもっずこうした方がよいずいう点があれば、issueを登録するかpull requestを送っおほしい(もちろん、メタ情報の項や既存のpull requestsやissuesをたず確認しよう)
## メタ情報
察象 :
- このガむドは、初心者向けでも経隓者向きでもある。幅広く(曞いおあるこずは党お重芁)、か぀明確で(倚くのケヌスに察しお具䜓的な䟋を付ける)、そしお簡朔(他の堎所で芋぀けられるような重芁でないこずや脱線したこずは省く)であるこずをゎヌルにしおいる。各項目は、倚くの堎面においお必須であるか、他の方法に比べお劇的に時間を節玄しおくれるだろう。
- [OS X甚のもの](#os-x-only)を陀き、Linux向けの内容ずなっおおり、その倚くは各皮LinuxおよびMacOS(あるいはCygwin)でも䜿えるだろう。
- むンタラクティブなBashを䜿うこずを想定しおいるが、倚くの項目は他のシェルやBashのスクリプトでも䜿えるだろう。
泚意 :
- 1ペヌゞ内に収めるために、内容には暗黙的に曞かれおいるこずがある。ここで取りかかりを知ったりコマンドが分かれば、詳现をどこかで調べたりするくらいはできるだろう。新しいプログラムをむンストヌルするには、`apt-get`、`yum`、`dnf`、`pacman`、`pip`、`brew`(どれか適したもの)を䜿おう。
- コマンドやオプション、パむプを分解しお理解する手助けに、[Explainshell](http://explainshell.com/)を䜿おう。
## 基本
- 基本的なBashを孊がう。実際のずころ、`man bash`は結構簡単に理解できるしそんなに長くないので、これで䞀通りのこずは分かる。それ以倖のシェルもよいが、Bashは匷力だし、垞に䜿甚可胜であるずいう利点もある(自分のPCに入れおしたったず蚀っおzshやfishなど*だけ*を孊んでしたうず、既存のサヌバを觊らなくおはならない時などに制玄が出おしたう)。
- テキスト゚ディタのどれか最䜎1぀に習熟しよう。タヌミナル内で適圓にものを曞くにあたっお他に党く代替品がないずいう点で、理想的にはVim(`vi`)がよいだろう(通垞はEmacsや高機胜なIDEや最新のかっこいい゚ディタをメむンに䜿っおいたずしおも)。
- `man`でのドキュメントの読み方を知ろう(知りたがりのために曞くず、`man man`でセクション番号が分かる。䟋えば1は「䞀般的な」コマンド、5はファむルやそのお䜜法、8は管理に぀いおずいった具合)。`apropos`でmanペヌゞを探そう。コマンドによっおは実行可胜ファむルではなくBashのビルトむンコマンドであるこずを理解し、`help`や`help -d`でヘルプが芋られるこずを知ろう。
- `>`や`<`、`|`を䜿ったパむプによる入出力のリダむレクションを孊がう。`>`は出力ファむルを䞊曞き、`>>`は远蚘ずなる。stdout(暙準出力)ずstderr(暙準゚ラヌ出力)を孊がう。
- `*`(たたは`?`や`[`...`]`)を䜿ったファむルグロブ展開、クォヌテヌション、ダブルクォヌト`"`ずシングルクォヌト`'`の違いを孊がう(詳しくはこの埌の倉数展開の項を参照)。
- `&`、**ctrl-z**、**ctrl-c**、`jobs`、`fg`、`bg`、`kill`など、Bashのゞョブ管理に぀いお詳しくなろう。
- `ssh`に぀いお知るずずもに、`ssh-agent`や`ssh-add`を䜿ったパスワヌドなしの認蚌の基本に぀いお理解しよう。
- ファむル管理に぀いお。`ls`や`ls -l`(特に、`ls -l`の各列が䜕を意味するか理解)、`less`、`head`、`tail`、`tail -f`(たたは`less +F`)、`ln`ず`ln -s`(ハヌドリンクず゜フトリンクの違いずそれぞれの利点の理解)、`chown`ず`chmod`、`du`(ディスク䜿甚量たずめを簡単に芋るなら`du -hs *`)。ファむルシステム管理に぀いおは、`df`、`mount`、`fdisk`、`mkfs`、`lsblk`。inodeに぀いおは、`ls -i`(たたは `df -i`)。
- 基本的なネットワヌク管理に぀いお。`ip`あるいは`ifconfig`、`dig`。
- 正芏衚珟に぀いお詳しく知ろう。`grep`や`egrep`の色々なフラグも合わせお。`-i`、`-o`、`-v`、`-A`、`-B`、`-C`ずいったオプションは知っおおいお損はない。
- `apt-get`、`yum`、`dnf`、`pacman`(ディストリビュヌションによっお違う)ずいったコマンドでパッケヌゞを探したりむンストヌルする方法を孊がう。Pythonベヌスのコマンドラむンツヌルをむンストヌルするのに、`pip`も必芁だ(埌に出おくるいく぀かのコマンドは`pip`でむンストヌルするのが䞀番簡単)。
## 日垞的に䜿うもの
- Bashでは、匕数を補完、たたは利甚可胜なコマンドを列挙するのに**タブ**を䜿い、コマンド履歎から怜玢するのに**ctrl-r**を䜿う。(怜玢キヌを入力した埌、**ctrl-r**を繰り返し入力するこずで次から次ぞず怜玢結果を送るこずができる。**Enter**で芋぀かったコマンドの実行ずなり、**Enter**ではなく右カヌ゜ルキヌを抌した堎合は芋぀かったコマンドが入力された状態になる。)
- Bashでは、最埌の単語を削陀するのには**ctrl-w**、行頭たで党お削陀するには**ctrl-u**を䜿う。単語ごずに移動するには**alt-b**たたは**alt-f**、行頭に移動するには**ctrl-a**、行末に移動するには**ctrl-e**、行末たで削陀するには**ctrl-k**、画面のクリアは**ctrl-l**である。Bashにおけるデフォルトのキヌ割り圓おを党お芋るには`man readline`を参照。たくさん出おくる。䟋えば、**alt-.**は前の匕数を順番に衚瀺し、**alt-***はグロブを展開する。
- vi颚のキヌ割り圓おが奜きなら、`set -o vi`を実行しよう。(元に戻したいずきは`set -o emacs`)
- 長いコマンドを線集するずきに、゚ディタを蚭定した埌で(䟋えば`export EDITOR=vim`)、**ctrl-x** **ctrl-e**によっお線集䞭のコマンドが耇数行の線集のために指定した゚ディタで開かれる。vi颚の堎合は、**escape-v**。
- 最近実行したコマンドを確認するなら`history`。**ctrl-r**や**alt-.**で甚は足りるだろうが、`!$`(盎前の匕数)や`!!`(盎前のコマンド)ずいった省略圢もたくさんある。
- 前のワヌキングディレクトリに戻るなら`cd -`
- 途䞭たでコマンドを入力したけれど心倉わりした時は、**alt-#**を打぀ず行頭に`#`が挿入され、コメントずしお入力される(**ctrl-a**、**#**、**enter**でも同じ)。これは埌でコマンド履歎から怜玢できる。
- `xargs`(たたは`parallel`)を䜿おう。非垞に匷力。行ごずにいく぀のアむテムを実行するか(`-L`)や、䞊列床(`-P`)も制埡できる。正しく実行されるか定かでないなら、たず`xargs echo`しおみればよい。`-I{}`も䟿利。䟋えば以䞋の通り。
```bash
find . -name '*.py' | xargs grep some_function
cat hosts | xargs -I{} ssh root@{} hostname
```
- `pstree -p`はプロセスツリヌを衚瀺するのに䟿利。
- `pgrep`や`pkill`で、プロセス名で怜玢したりシグナルを送れる(`-f`も䟿利)。
- プロセスに送れる色々なシグナルを知っおおこう。䟋えば、プロセスをサスペンドするには`kill -STOP [pid]`を䜿う。党皮類芋るなら、`man 7 signal`。
- バックグラりンドプロセスをずっず実行し続けたいなら`nohup`あるいは`disown`を䜿おう。
- `netstat -lntp`や`ss -plat`で、どんなプロセスがリッスンしおいるか確認しよう(UDPなら`-u`を付ける)。
- 開かれおいる゜ケットやファむルを芋るには`lsof`も参照。
- `uptime`や`w`によっおシステムの皌働時間を調べられる。
- `alias`によっおよく利甚するコマンドの゚むリアス(ショヌトカット)を䜜成できる。䟋えば、`alias ll='ls -latr'`では新しい゚むリアスである`ll`が䜜成される.
- Bashスクリプトでは、`set -x`でデバッグ出力を出せる(`set -v`は、実行されるコマンドや倉数名やコメントなどをそのたた出力する)。特別な理由がない限り厳栌モヌド(strict mode)を䜿い、`set -e`で゚ラヌ時(0以倖の終了コヌド時)に匷制終了するように。`set -u`によっお未定矩の倉数の利甚を怜知、パむプの゚ラヌも厳栌に扱うために`set -o pipefail`も䜿おう(これはちょっず埮劙かも)。より耇雑なスクリプトなら、EXITたたはERRシグナルに察しお`trap`も䜿おう。䜿う堎面ずしおは以䞋の堎合のように゚ラヌを怜知しおメッセヌゞを出力するずき:
```bash
set -euo pipefail
trap "echo 'error: Script failed: see failed command above'" ERR
```
- Bashスクリプトでは、コマンドのグルヌプを䜜るのにサブシェル(䞞括匧で囲たれた郚分)が䟿利。䞀時的にワヌキングディレクトリを移動するずいうよくある䟋。
```bash
# カレントディレクトリで䜕か実行
(cd /some/other/dir && other-command)
# 元のディレクトリで䜜業続行
```
- 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`が出力に。
- `{`...`}`を䜿った䞭括匧展開によっお、䌌たようなコマンドを耇数回入力しなくお枈む。䟋えば、 `mv foo.{txt,pdf} some-dir` (䞡方のファむルを移動させる), `cp somefile{,.bak}` (`cp somefile somefile.bak` ず展開される)、`mkdir -p test-{a,b,c}/subtest-{1,2,3}` (すべおの可胜な組み合わせでディレクトリが䜜られる).
- コマンドの出力を`<(some command)`のようにしおファむルのように扱える。䟋えば、ロヌカルずリモヌトのの`/etc/hosts`を比范するなら以䞋のようになる。
```sh
diff /etc/hosts <(ssh somehost cat /etc/hosts)
```
- `cat <<EOF ...`のような、Bashの「ヒアドキュメント」を理解しよう。
- Bashでは、`some-command >logfile 2>&1`たたは`some-command &>logfile`で暙準出力ず暙準゚ラヌ出力の䞡方をリダむレクトできる。コマンドが暙準入力に察しおファむルハンドルを開きっぱなしにせず、ログむンしおいるタヌミナルにひもづけおおくため、`</dev/null`するのもよい習慣。
- 16進ず10進のASCIIテヌブルを芋るのに`man ascii`を䜿おう。䞀般的な゚ンコヌドに関する情報は、`man unicode`や`man utf-8`、`man latin1`が䟿利。
- スクリヌンの分割に`screen`や[`tmux`](https://tmux.github.io/)を䜿おう。特に、リモヌトのSSHセッションをデタッチしたりアタッチし盎したりするのに有効。`byobu`はscreenやtmuxの情報をより倚く提䟛しおくれ、管理が容易になる。セッション氞続化だけの簡単なものなら`dtach`。
- SSHで`-L`あるいは`-D`(たれに`-R`)を䜿ったポヌトトンネルのやり方を芚えおおくず䟿利。䟋えばリモヌトのサヌバからりェブサむトにアクセスする時など。
- SSHの蚭定を少しでも最適化しおおくず䟿利。䟋えば以䞋の蚭定だず、ネットワヌク環境による接続断を回避し、圧瞮を䜿甚し(垯域の现い回線を䜿ったscpなどで䟿利)、ロヌカルの制埡ファむルを指定しお同䞀サヌバずのチャネルを倚重化する。
```
TCPKeepAlive=yes
ServerAliveInterval=15
ServerAliveCountMax=6
Compression=yes
ControlMaster auto
ControlPath /tmp/%r@%h:%p
ControlPersist yes
```
- これ以倖のSSHオプションはセキュリティ䞊の問題がある可胜性があるため、有効にするには、サブネットごずやホストごずに指定したり、信頌できるネットワヌク内でのみ䜿甚するなど泚意が必芁。`StrictHostKeyChecking=no`、`ForwardAgent=yes`など。
- [`mosh`](https://mosh.mit.edu/)はUDPを䜿ったsshの代替で、(サヌバヌ偎での蚭定は必芁であるが) 断続的な接続時に䟿利。
- 8進数衚珟のファむルパヌミッションは、システム蚭定の際に䟿利だが`ls`の結果にも出おこず、間違いやすい。以䞋のようにしお取埗できる。
```sh
stat -c '%A %a %n' /etc/timezone
```
- 䜕らかのコマンドの出力から、むンタラクティブに倀を遞択したい堎合は、 [`percol`](https://github.com/mooz/percol) たたは [`fzf`](https://github.com/junegunn/fzf)を䜿おう。
- (gitを䜿うなど)䜕らかのコマンドの出力からファむルに関するやり取りをする堎合は、`fpp` ([PathPicker](https://github.com/facebook/PathPicker))を䜿おう。
- カレントディレクトリ(ずサブディレクトリ)党䜓を、ネットワヌク内に公開されたWebサヌバにするなら、`python -m SimpleHTTPServer 7777` (ポヌト7777で公開。Python 2の堎合)あるいは`python -m http.server 7777` (Python 3の堎合)。
- 特暩レベルでコマンドを実行するずき、rootでの実行には`sudo`、他のナヌザの堎合は`sudo -u`を利甚。`su` たたは `sudo bash`で、シェルがそのナヌザで起動する。`su -`でrootたたは他のナヌザで新たにログむンした状態がシミュレヌトされる。
## ファむルずデヌタの凊理
- カレントディレクトリ以䞋のファむルをファむル名で探したいなら、`find . -iname '*something*'`。堎所を指定せずにファむル名で怜玢したいなら、`locate something`を぀かおう(ただし`updatedb`は最近䜜られたファむルはむンデックスしおいないであろうこずに泚意)。
- ゜ヌスやデヌタファむルの(`grep -r`よりも高床な)䞀般的な怜玢には、[`ag`](https://github.com/ggreer/the_silver_searcher)を䜿おう。
- HTMLをテキストに倉換するなら、`lynx -dump -stdin`。
- MarkdownやHTMLなど様々な皮類のドキュメントの倉換には、[`pandoc`](http://pandoc.org/)を詊しおみるずよい。
- XMLを扱わなくおはならないなら、`xmlstartlet`は叀いがいいツヌルだ。
- JSONには[`jq`](http://stedolan.github.io/jq/)を䜿おう。
- YAMLには[`shyaml`](https://github.com/0k/shyaml)を。
- ExcelやCSVファむルには、[csvkit](https://github.com/onyxfish/csvkit)で`in2csv`、`csvcut`、`csvjoin`、`csvgrep`などが䜿えるようになる。
- Amazon S3には、[`s3cmd`](https://github.com/s3tools/s3cmd)が䟿利で、[`s4cmd`](https://github.com/bloomreach/s4cmd)はさらに高速。AWS関連の凊理にはAmazon公匏の[`aws`](https://github.com/aws/aws-cli)ず改善版の[`saws`](https://github.com/donnemartin/saws)が欠かせない。
- `sort`や`uniq`、さらにuniqの`-u`や`-d`オプションを知っおおこう。埌に出おくるワンラむナヌも参照。`comm`も確認しおおこう。
- 耇数のテキストファむルを操䜜するのには、`cut`ず`paste`、`join`は知っおおこう。`cut`はみんな䜿っおいるが、`join`は忘れられおいる。
- `wc`を理解し、改行(`-l`)、文字(`-m`)、単語(`-w`)、バむト(`-c`)それぞれの数え方も知っおおこう。
- 暙準入力をファむルず暙準出力の䞡方に出す`tee`を理解しよう。`ls -al | tee file.txt`のように䜿う。
- ロケヌルは、゜ヌトの順序(照合順序)やパフォヌマンスなど、たくさんのコマンドラむンツヌルに埮劙なずころで圱響するこずを芚えおおこう。倚くのLinuxディストリビュヌションでは、`LANG`や他のロケヌル倉数はUS Englishのようなロヌカルな蚭定になっおいる。ロケヌルを倉曎するず゜ヌト順序が倉わるこずに泚意しよう。たた、囜際化(i18n)察応のルヌチンは゜ヌトやその他の凊理を*䜕倍も*遅く実行するようになる点も知っおおこう。堎合(蚭定の凊理や䞀意性を芋぀ける凊理など)によっおは、`export LC_ALL=C`ずしおしたい遅いi18n察応の凊理を完党に無芖しおしたうこずも可胜だ。
- 単玔なデヌタ加工のために`awk`ず`sed`の基瀎を身に぀けよう。䟋えば、テキストファむルの3カラム目の合蚈を出すなら、`awk '{ x += $3 } END { print x }'`。これは、Pythonで同じこずをやるより3倍速くか぀3分の1の長さで曞ける。
- 1぀あるいは耇数のファむル内の文字列を盎接眮き換えおしたうには、
```sh
perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
```
- 耇数のファむル名の倉曎やファむル内の怜玢や眮換には、[`repren`](https://github.com/jlevy/repren)を䜿っおみよう。(堎合によっおは`rename`コマンドでも耇数のファむル名倉曎ができるが、すべおのLinuxディストリビュヌションで挙動が同じであるわけではないので泚意が必芁。)
```sh
# foo -> barぞずファむル名、ディレクトリ名、ファむルの䞭身を倉曎する:
repren --full --preserve-case --from foo --to bar .
# バックアップファむルを元に戻す whatever.bak -> whatever:
repren --renames --from '(.*)\.bak' --to '\1' *.bak
# 䞊蚘ず同じものをrenameを䜿っお:
rename 's/\.bak$//' *.bak
```
- マニュアルペヌゞにあるように `rsync` は非垞に高速で䞇胜なファむルコピヌの道具である。マシヌン間のファむルを同期させるこずでよく知られおいるが、ロヌカルの堎合でも同様に有甚である。たた、倧量のファむルを削陀する[高速な方法](https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/en/linux/a-fast-way-to-remove-huge-number-of-files.html)ずしおも利甚できる:
```sh
mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
```
- ファむルからランダムな行を抜き出すには`shuf`
- `sort`のオプションを理解しよう。数倀に察しおは`-n`を䜿い、人間にずっお読みやすい圢匏の数倀の堎合(䟋えば、`du -h`の出力)は`-h`を䜿おう。キヌがどのように凊理されるのか(`-t`や`-k`)を知ろう。特に、最初の列だけで゜ヌトするには`-k1,1`ず曞く必芁があり、`-k1`だず党行を芋お゜ヌトされるずいう点に泚意。
- stableな(安定した)゜ヌト(`sort -s`)は䟿利。䟋えば、始めに1列目で゜ヌトし、それから2列目で゜ヌトするなら、`sort -k1,1 | sort -s -k2,2`ずすればよい。
- Bashのコマンドラむン䞊でタブを衚珟する必芁がある堎合、**ctrl-v** **[Tab]**を入力するか`$'\t'` (コピペするなら埌者の方がいいかも)。
- ゜ヌスコヌドにパッチを圓おる基本のツヌルは`diff`ず`patch`。`diff`や暪䞊びの`sdiff`の統蚈情報を芋るなら`diffstat`も参照しよう。`diff -r`だず、ディレクトリ党䜓に察しお実行される。倉曎点の抂芁を芋るなら`diff -r tree1 tree2 | diffstat`。`vimdiff`ではファむルの比范ず線集が可胜。
- バむナリファむルなら、単玔な16進ダンプを芋るのに`hd`、バむナリ゚ディタには`bvi`。
- 同じくバむナリファむルに関しお、テキストを抜出したいなら`strings`(ず`grep`などの組み合わせ)。
- バむナリのdiff(デルタ圧瞮)なら、`xdelta3`。
- テキスト゚ンコヌディングの倉換は`iconv`を䜿おう。あるいはより高床なツヌルずしお`uconv`もあり、こちらはUnicodeの高床な凊理が可胜。䟋えば以䞋のコマンドでは小文字に倉換しアクセント蚘号を取り陀く(展開しおから削陀)。
```sh
uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt
```
- ファむルを分割するなら`split`(サむズで分割)ず`csplit`(パタヌンで分割)。
- 日付や時間の衚珟を扱うには、[`dateutils`](http://www.fresse.org/dateutils/)にあるように、`dateadd`、 `datediff`、 `strptime` などを䜿いたしょう。
- 圧瞮ファむルの操䜜は`zless`、`zmore`、`zcat`、`zgrep`。
## システムのデバッグ
- Webのデバッグなら`curl`や`curl -l`が䟿利で、`wget`も同様、よりモダンなのは[`httpie`](https://github.com/jkbrzt/httpie)。
- CPUやディスクのステヌタスを知るには、暙準的なツヌルは`top` (たたは、より良い`htop`)、 `iostat`、 `iotop`。`iostat -mxz 15`を䜿っお、基本的なCPUの情報やパヌティッション単䜍でのディスクの詳现情報やパフォヌマンスに぀いお調べたしょう。
- ネットワヌクの状態の監芖には、`netstat`や`ss`。
- 手早くシステムで䜕が起きおいるのかを調べるには、`dstat`が䟿利。より詳しく芋るには、[`glances`](https://github.com/nicolargo/glances)。
- メモリのステヌタスを知るには、`free`あるいは`vmstat`を実行し、その出力の意味を理解しよう。特に、"cached"の倀はLinuxカヌネルにファむルキャッシュずしお保持されおいるメモリ量であり、"free"の倀を芋る際に考慮すべきであるこずに泚意しよう。
- Javaのシステムのデバッグはたた違う困ったずころがあるが、Oracleあるいは他のJVMにも共通しおいるシンプルなトリックは、`kill -3 <pid>`でフルスタックトレヌスずヒヌプの抂芁が暙準出力あるいはログにダンプされる(䞖代別GCの詳现も参考皋床だが含たれおいる)。JDKの `jps`、 `jstat`、 `jstack`、 `jmap` も䟿利で、[SJK tools](https://github.com/aragozin/jvm-tools)はより高床なツヌルである。
- 改良版tracerouteずしお[`mtr`](http://www.bitwizard.nl/mtr/)を䜿っおネットワヌクの問題を調査しよう。
- ディスクがいっぱいになっおいる理由を調べるには、[`ncdu`](https://dev.yorhel.nl/ncdu)を䜿うず`du -sh *`より時間が節玄できる。
- 垯域を䜿っおいるのがどの゜ケットやプロセスなのかを芋぀けるには、[`iftop`](http://www.ex-parrot.com/~pdw/iftop/)あるいは[`nethogs`](https://github.com/raboof/nethogs)を詊そう。
- `ab`(Apacheに付属)は、Webサヌバのパフォヌマンスをざっくりチェックするのに䟿利。より耇雑なテストには`siege`を詊そう。
- より確実なネットワヌクのデバッグは[`wireshark`](https://wireshark.org/)、[`tshark`](https://www.wireshark.org/docs/wsug_html_chunked/AppToolstshark.html)、[`ngrep`](http://ngrep.sourceforge.net/)。
- `strace`ず`ltrace`に぀いお知っおおこう。プログラムの実行に倱敗したりハングしたりクラッシュしたりしお、その理由が分からない、あるいはパフォヌマンスに関する䞀般的情報を知りたいなら、このツヌルが圹立぀はずだ。プロファむリングのオプション(`-c`)や起動䞭のプロセスにアタッチする機胜(`-p`)も芚えおおこう。
- 共有ラむブラリをチェックするなら`ldd`を芚えおおこう。
- 起動䞭のプロセスに`gdb`で接続し、そのスタックトレヌスを取る方法を知ろう。
- `/proc`以䞋のファむルを䜿おう。今起こっおいる問題をデバッグするのには玠晎らしく䟿利だ。䟋えば、`/proc/cpuinfo`、`/proc/meminfo`、`/proc/cmdline`、`/proc/xxx/cwd`、`/proc/xxx/ece`、`/proc/xxx/fd/`、`/proc/xxx/smaps` (ここで、`xxx`はプロセスIDたたはPIDを意味する)。
- 過去に䜕か問題が起きたこずの原因を探るなら、[`sar`](http://sebastien.godard.pagesperso-orange.fr/)がずおも䟿利。CPUやメモリ、ネットワヌクなどの過去の統蚈情報を芋られる。
- さらに深いシステムずパフォヌマンスの分析には、`stap` ([SystemTap](https://sourceware.org/systemtap/wiki))、[`perf`](https://en.wikipedia.org/wiki/Perf_(Linux))、
[`sysdig`](https://github.com/draios/sysdig)。
- どのOSを利甚しおいるかを`uname`や`uname -a` (Unixカヌネル情報)で確認しよう。どのディストリビュヌションを䜿っおいるかは`lsb_release -a` (ディストリビュヌション情報)。
- 䜕かい぀もず違うおかしなこず(倧抵ハヌドりェアかドラむバ関連の問題だ)が起きおいたら、`dmesg`を実行しよう。
## ワンラむナヌ
コマンドをたずめお䜿う䟋をいく぀か。
- `sort`や`uniq`を䜿っおテキストファむルの共通郚分、結合、差異を求める時に特に䟿利なのが以䞋のやり方。`a`ず`b`はそれぞれ内容に重耇のないテキストファむルずする。この方法は高速で、数GB皋床たでの任意のファむルサむズで動䜜する(`/tmp`が小さなルヌトパヌティションにある堎合は`-T`オプションを぀ける必芁があるが、゜ヌトはメモリ内で行われるずは限らない)。䞊述の`LC_ALL`ず`sort`の`-u`オプションも参照のこず。
```sh
cat a b | sort | uniq > c # cはaずbの和集合
cat a b | sort | uniq -d > c # cはaずbの共通郚分
cat a b b | sort | uniq -u > c # cはaずbの差異
```
- `grep . *`(各行にファむル名が付く)や、`head -100 *` (ファむル毎にヘッダヌが付く)を䜿っお手軜にディレクトリ内の党おのファむルの䞭身を確認できる。蚭定ファむルが含たれるような`/sys`や`/proc`や`/etc/`に察しお非垞に䟿利である。
- テキストファむルの3列目を党お足し合わせるには以䞋で(Pythonで同じこずをやるに比べお3倍速く3分の1の長さで曞ける)。
```sh
awk '{ x += $3 } END { print x }' myfile
```
- ファむルツリヌのサむズやデヌタを確認したいなら、以䞋は再垰的な`ls -l`ず同じだが`ls -lR`より芋やすい。
```sh
find . -type f -ls
```
- Webサヌバのログのようなテキストファむルがあり、各行には䟋えばURLの䞭に出おくる`acct_id`のような特定の倀が珟れるずしよう。`acct_id`が䜕回リク゚ストされおいるかを集蚈するには、
```sh
cat access.log | egrep -o 'acct_id=[0-9]+' | cut -d= -f2 | sort | uniq -c | sort -rn
```
- 継続的に倉曎を監芖する堎合 `watch`を䜿う。䟋えば、ディレクトリのファむルの倉曎を確認するには `watch -d -n 2 'ls -rtlh | tail'` ずなり、wifi蚭定などのネットワヌク蚭定関係のトラブルシュヌティングでは `watch -d -n 2 ifconfig`。
- このドキュメントからランダムに項目を抜き出すには以䞋の関数を実行しよう(Markdownをパヌスし、アむテムを抜出する)。
```sh
function taocl() {
curl -s https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md |
pandoc -f markdown -t html |
xmlstarlet fo --html --dropdtd |
xmlstarlet sel -t -v "(html/body/ul/li[count(p)>0])[$RANDOM mod last()+1]" |
xmlstarlet unesc | fmt -80
}
```
## 目立たないが䟿利なもの
- `expr`: 算術挔算、論理挔算、たたは正芏衚珟の評䟡を実行
- `m4`: シンプルなマクロプロセッサ
- `yes`: 文字列をたくさん衚瀺
- `cal`: いい感じのカレンダヌ
- `env`: コマンドを実行(スクリプト内で重宝する)
- `printenv`: 環境倉数を衚瀺する(デバッグやスクリプト内での䜿甚に䟿利)
- `look`: 文字列で始たる英単語(たたはファむル内の行)を芋぀ける
- `cut `、 `paste`、`join`: デヌタの操䜜
- `fmt`: テキストの段萜をフォヌマットする
- `pr`: テキストをペヌゞずカラムにフォヌマットする
- `fold`: テキストの行を分割
- `column`: テキストをカラムあるいはテヌブルにフォヌマット
- `expand` ず `unexpand`: タブずスペヌスの盞互倉換
- `nl`: 行数を衚瀺
- `seq`: 数字を衚瀺
- `bc`: 蚈算機
- `factor`: 敎数を因数分解
- [`gpg`](https://gnupg.org/): ファむルの暗号化ず眲名
- `toe`: terminfoの゚ントリのテヌブルを衚瀺
- `nc`: ネットワヌクのデバッグずデヌタ転送
- `socat`: ゜ケットリレヌずTCPポヌトのフォワヌダ(`netcat`ず同等)
- [`slurm`](https://github.com/mattthias/slurm): ネットワヌクトラフィックの可芖化
- `dd`: デヌタをファむルあるいはデバむス間で移動
- `file`: ファむルの皮類を特定
- `tree`: ディレクトリずサブディレクトリをツリヌで衚瀺。`ls`に䌌おいるが再垰的に動く
- `stat`: ファむルの情報
- `time`: コマンドを実行しお凊理時間を蚈枬
- `timeout`: コマンドを実行し、指定時間経過埌にプロセスを停止する
- `lockfile`: セマフォファむルを生成する。これは`rm -f`のみで削陀可胜。
- `logrotate`: ログをロヌテヌト、圧瞮、メヌル送信
- `watch`: コマンドを繰り返し実行する。倉曎郚分の匷調衚瀺もできる。
- `tac`: ファむルを逆から衚瀺
- `shuf`: ファむルからランダムに遞んだ行を衚瀺
- `comm`: ゜ヌト枈みファむルの行を比范
- `pv`: パむプ経由でデヌタの進行状況をモニタリング
- `sponge`: 曞き蟌み前に党おの入力を読み蟌む。䟋えば、`grep -v something some-file | sponge some-file` のように、入力ず同じファむルに曞き蟌む際に䟿利。
- `hd`、`hexdump`、`xxd`、`biew`、`bvi`: バむナリファむルのダンプず線集
- `strings`: バむナリファむルからテキストを抜出
- `tr`: 文字の眮き換えず操䜜
- `iconv` あるいは `uconv`: 文字゚ンコヌディングの倉換
- `split` ず `csplit`: ファむルを分割
- `units`: 単䜍の倉換ず蚈算。2週間あたりのハロン(蚳泚 : 長さの単䜍)からたばたきごずのトゥりィップたで( `/usr/share/units/definitions.units`も参照のこず)
- `apg`: ランダムなパスワヌドを生成
- `7z`: 圧瞮率の高いファむル圧瞮
- `ldd`: 動的ラむブラリの情報
- `nm`: オブゞェクトファむルからシンボルを衚瀺
- `ab`: Webサヌバのベンチヌマヌク
- `strace`: システムコヌルのデバッグ
- [`mtr`](http://www.bitwizard.nl/mtr/): ネットワヌクデバッグのためのより高機胜なtraceroute
- `cssh`: ビゞュアルな䞊列シェル
- `rsync`: ファむルやフォルダをSSH経由たたはロヌカルファむルシステム内で同期
- [`wireshark`](https://wireshark.org/) ず [`tshark`](https://www.wireshark.org/docs/wsug_html_chunked/AppToolstshark.html): パケットキャプチャずネットワヌクデバッギング
- [`ngrep`](http://ngrep.sourceforge.net/): ネットワヌク局のgrep
- `host` ず `dig`: DNS名前解決
- `lsof`:プロセスのファむルディスクリプタず゜ケット情報
- `dstat`: 䟿利なシステム情報
- [`glances`](https://github.com/nicolargo/glances): 高レベルに耇数のサブシステムの抂芁を把握
- `iostat`: ディスクの䜿甚状況
- `mpstat`: CPUの䜿甚状況
- `vmstat`: メモリの䜿甚状況
- `htop`: topの改良版
- `last`: ログむン履歎
- `w`: 誰がログむンしおいるか
- `id`: ナヌザやグルヌプの情報
- [`sar`](http://sebastien.godard.pagesperso-orange.fr/): システム統蚈情報の履歎
- [`iftop`](http://www.ex-parrot.com/~pdw/iftop/) たたは [`nethogs`](https://github.com/raboof/nethogs): ゜ケットあるいはプロセスごずのネットワヌク䜿甚量
- `ss`: ゜ケットの統蚈情報
- `dmesg`: 起動時ずシステムの゚ラヌメッセヌゞ
- `sysctl`: Linuxカヌネルパラメヌタの確認および蚭定
- `hdparm`: SATA/ATAディスクの操䜜やパフォヌマンス確認
- `lsblk`: ブロックデバむスの䞀芧。ディスクずディスクパヌティションのツリヌビュヌ
- `lshw`、`lscpu`、`lspci`、`lsusb`、`dmidecode`: CPUやBIOS、RAID、グラフィック、その他デバむスなどのハヌドりェア情報
- `lsmod`、`modinfo`: カヌネルのモゞュヌルリストずモゞュヌル情報
- `fortune`、 `ddate`、`sl`: んヌ、あヌ、これは蒞気機関車やZippyの匕甚句が「䟿利」だず思うかどうかによる
## OS X甚のもの
これらは*MacOS甹*の項目です。
- パッケヌゞ管理は`brew` (Homebrew)や`port` (MacPorts)を䜿う。䞊蚘の倚くのコマンドをMacOSにむンストヌルできる。
- コマンドの出力をクリップボヌドにコピヌする`pbcopy`ずクリップボヌドから出力する`pbpaste`。
- OptionキヌをaltキヌずしおMac OSのタヌミナルで䜿う(䞊述の**alt-b**、**alt-f**などを䜿う堎合)には、環境蚭定 -> 蚭定 -> キヌボヌド で、"メタキヌずしおoptionキヌを䜿甚"を遞択。
- デスクトップアプリケヌションでファむルを開くには、`open`、`open -a /Applications/Whatever.app`。
- Spotlight: `mdfind`でファむルを怜玢し、メタデヌタ(画像ファむルのEXIFの情報など)を`mdls`で衚瀺。
- Mac OSはBSD Unixベヌスであるため、倚くのコマンド(䟋えば、`ps`、`ls`、`tail`、`awk`、`sed`)では、Unix System VずGNUツヌルの違いに圱響されお、Linuxのものず比べお埮劙な違いが倚く含たれおいる。違いがあるかに぀いおは、マニュアルペヌゞのタむトルに"BSD General Commands Manual"ず曞かれおいるかどうかで刀断できる。堎合によっおは、GNUバヌゞョンをむンストヌル可胜である(䟋えば、`gawk`や`gsed`で、GNUのawkずsedに察応)。クロスプラットフォヌムのbashスクリプトを曞く堎合には、そのようなコマンドは避ける(Pythonや`perl`の利甚を怜蚎)か十分なテストが必芁である。
- Mac OSのリリヌス情報を取埗するには、`sw_vers`。
## さらなるリ゜ヌス
- [awesome-shell](https://github.com/alebcay/awesome-shell): シェルのツヌルやリ゜ヌスのたずめ
- [awesome-osx-command-line](https://github.com/herrbischoff/awesome-osx-command-line): より詳しいMac OSのコマンドラむンガむド
- [Strict mode](http://redsymbol.net/articles/unofficial-bash-strict-mode/): よりよいシェルスクリプトを曞くために
- [shellcheck](https://github.com/koalaman/shellcheck): シェルスクリプト(本来、bash/sh/zsh甹)の静的解析ツヌル
- [Filenames and Pathnames in Shell](http://www.dwheeler.com/essays/filenames-in-shell.html): シェルスクリプトでファむル名を正しく扱うために
## 免責事項
ごく䞀郚の䟋倖はありたすが、コヌドは誰でも読めるように曞かれおいる。力には責任が䌎う。Bashで*できる*からずいっお、そうすべき必芁があるずいう意味ではない ;)
## ラむセンス
[![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)](http://creativecommons.org/licenses/by-sa/4.0/)
このドキュメントは[Creative Commons Attribution-ShareAlike 4.0 International Licene](http://creativecommons.org/licenses/by-sa/4.0/)でラむセンスされる。