You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

47 KiB

🌍 ČeÅ¡tina ∙ Deutsch ∙ ΕλληΜικά ∙ English ∙ Español ∙ Français ∙ Indonesia ∙ Italiano ∙ 日本語 ∙ 한국얎 ∙ Português ∙ Română ∙ РусскОй ∙ Slovenščina ∙ УкраїМська ∙ 简䜓䞭文 ∙ 繁體䞭文

The Art of Command Line

質問しおみよう

https://gitter.im/jlevy/the-art-of-command-lineでチャットに参加しよう

curl -s 'https://raw.githubusercontent.com/jlevy/the-art-of-command-line/master/README.md' | egrep -o '\w+' | tr -d '`' | cowsay -W50

コマンドラむンで流れるように操䜜ができるずいうこずは、軜く芋られたり他人から理解されないスキルだずみなされるこずもあるだろう。しかしそのスキルは、明らかにかすぐ分かるようかは問わず、゚ンゞニアずしおのあなたの柔軟性や生産性を改善しおくれるものだ。ここでは、Linuxでコマンドラむンを䜿う䞊で䟿利だず思ったメモやTipsの数々を挙げおみる。あるものは基瀎的だが、非垞に詳しいもの、掗緎されたもの、曖昧なものもある。このペヌゞはそんなに長いものではないが、ここに曞いおあるこずの党おを䜿ったり思い出すこずができれば、かなり詳しくなれるだろう。

このドキュメントは倚くの執筆者ず翻蚳者による成果である。 ここに曞いおあるこずの倚くは、元々Quoraに曞かれおいたものが倚いが、より優れた人たちがすぐに改善案を出すこずができるGitHubに眮くのがよいのではず思った。 コマンドラむンに぀いお疑問があるなら質問しおみよう ゚ラヌや改善点を芋぀けたら貢献しおみよう!

メタ情報

察象 :

  • このガむドは、初心者向けでも経隓者向きでもある。幅広く(曞いおあるこずは党お重芁)、か぀明確で(倚くのケヌスに察しお具䜓的な䟋を付ける)、そしお簡朔(他の堎所で芋぀けられるような重芁でないこずや脱線したこずは省く)であるこずをゎヌルにしおいる。各項目は、倚くの堎面においお必須であるか、他の方法に比べお劇的に時間を節玄しおくれるだろう。
  • OS X甚のものを陀き、Linux向けの内容ずなっおおり、その倚くは各皮LinuxおよびMacOS(あるいはCygwin)でも䜿えるだろう。
  • むンタラクティブなBashを䜿うこずを想定しおいるが、倚くの項目は他のシェルやBashのスクリプトでも䜿えるだろう。
  • (このリポゞトリぞ)組み蟌むメリットがあるのであれば、暙準Unixコマンドやパッケヌゞむンストヌルコマンドも含める。

泚意 :

  • 1ペヌゞ内に収めるために、内容には暗黙的に曞かれおいるこずがある。ここで取りかかりを知ったりコマンドが分かれば、詳现をどこかで調べたりするくらいはできるだろう。新しいプログラムをむンストヌルするには、apt-get、yum、dnf、pacman、pip、brew(どれか適したもの)を䜿おう。
  • コマンドやオプション、パむプを分解しお理解する手助けに、Explainshellを䜿おう。

基本

  • 基本的なBashを孊がう。実際のずころ、man bashは結構簡単に理解できるしそんなに長くないので、これで䞀通りのこずは分かる。それ以倖のシェルもよいが、Bashは匷力だし、垞に䜿甚可胜であるずいう利点もある(自分のPCに入れおしたったず蚀っおzshやfishなどだけを孊んでしたうず、既存のサヌバを觊らなくおはならない時などに制玄が出おしたう)。

  • テキスト゚ディタのどれか最䜎1぀に習熟しよう。nano゚ディタは線集の基本操䜜(開く、修正する、保存する、怜玢する)を孊ぶ最もシンプルな方法のひず぀だ。タヌミナル内で適圓にものを曞くにあたっお他に党く代替品がないずいう点で、理想的には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、traceroute、 route。

  • gitのようなバヌゞョン管理システムを孊んで䜿っおみよう。

  • 正芏衚珟に぀いお詳しく知ろう。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。!nず続けるこずで(nはコマンド暪に衚瀺される数字)再床実行できる。ctrl-rや**alt-.**で甚は足りるだろうが、!$(盎前の匕数)や!!(盎前のコマンド)ずいった省略圢もたくさんある。

  • cdでホヌムディレクトリぞの移動。ホヌムディレクトリに関連するファむルにアクセスする堎合はプレフィックス~を぀ける(䟋: ~/.bashrc)。shスクリプトの䞭では$HOMEでホヌムディレクトリを衚すこずができる。

  • 前のワヌキングディレクトリに戻るならcd -

  • 途䞭たでコマンドを入力したけれど心倉わりした時は、alt-#を打぀ず行頭に#が挿入され、コメントずしお入力される(ctrl-a、#、enterでも同じ)。これは埌でコマンド履歎から怜玢できる。

  • xargs(たたはparallel)を䜿おう。非垞に匷力。行ごずにいく぀のアむテムを実行するか(-L)や、䞊列床(-P)も制埡できる。正しく実行されるか定かでないなら、たずxargs echoしおみればよい。-I{}も䟿利。䟋えば以䞋の通り。

   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が䜜成される.

  • よく䜿う゚むリアス、シェル蚭定、機胜を~/.bashrcに保存し、ログむンシェルに反映しよう。これで党おのセッションであなたの蚭定が利甚できる。

  • ログむン時に実行されおほしいコマンド、環境倉数を~/.bash_profileに蚘茉する。画面からのログむンやcronゞョブで起動されるシェルには別の蚭定が必芁だ。

  • Gitで様々なマシンの蚭定ファむル(䟋:.bashrcや.bash_profile)を同期させよう。

  • 空癜を含む倉数やファむル名には泚意が必芁だ。Bash倉数にはクオヌトを぀けよう、こんな颚に"$FOO"。 ファむル名の区切りずしおヌル文字を指定する堎合には-0や-print0オプションを付䞎しよう。䟋: locate -0 pattern | xargs -0 ls -al or find / -print0 -type d | xargs -0 ls -al。空癜を含んだファむル名を繰り返し実行するためには、IFS=$'\n'`を䜿っおIFSを改行のみにしよう。

  • Bashスクリプトでは、set -xでデバッグ出力を出せる(set -vは、実行されるコマンドや倉数名やコメントなどをそのたた出力する)。特別な理由がない限り厳栌モヌド(strict mode)を䜿い、set -eで゚ラヌ時(0以倖の終了コヌド時)に匷制終了するように。set -uによっお未定矩の倉数の利甚を怜知、パむプの゚ラヌも厳栌に扱うためにset -o pipefailも䜿おう(これはちょっず埮劙かも)。より耇雑なスクリプトなら、EXITたたはERRシグナルに察しおtrapも䜿おう。䜿う堎面ずしおは以䞋の堎合のように゚ラヌを怜知しおメッセヌゞを出力するずき:

      set -euo pipefail
      trap "echo 'error: Script failed: see failed command above'" ERR
  • 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} (すべおの可胜な組み合わせでディレクトリが䜜られる).

  • 展開の順序は括匧→チルダ、パラメヌタや倉数、蚈算機号、コマンド眮換(巊から右)→文字の分割→ファむル名の順だ。(䟋えば、{1..20}のような範囲は{$a..$b}ずいうようには衚珟できない。seqやforルヌプを䜿っおこんな颚に衚すこずができる。seq $a $b or for((i=a; i<=b; i++)); do ... ; done)

  • コマンドの出力を<(some command)のようにしおファむルのように扱える。䟋えば、ロヌカルずリモヌトのの/etc/hostsを比范するなら以䞋のようになる。

      diff /etc/hosts <(ssh somehost cat /etc/hosts)
  • スクリプトを曞く時は党おのコヌドを䞭括匧で囲たなくおはいけない。もし閉じ括匧が欠けおいたらシンタックス゚ラヌで実行が劚げられる。これはあなたがスクリプトをダりンロヌドしたずきに刀明する。䞍完党なスクリプトの実行によっお郚分的にwebからダりンロヌドしおしたうのを防ぐためだ。
{
      # Your code here
}
cat <<EOF
input
on multiple lines
EOF
  • 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を䜿おう。特に、リモヌトのSSHセッションをデタッチしたりアタッチし盎したりするのに有効。byobuはscreenやtmuxの情報をより倚く提䟛しおくれ、管理が容易になる。セッション氞続化だけの簡単なものならdtach。

  • SSHで-Lあるいは-D(たれに-R)を䜿ったポヌトトンネルのやり方を芚えおおくず䟿利。䟋えばリモヌトのサヌバからりェブサむトにアクセスする時など。

  • SSHの蚭定を少しでも最適化しおおくず䟿利。䟋えば以䞋の~/.ssh/configの蚭定だず、ネットワヌク環境による接続断を回避し、圧瞮を䜿甚し(垯域の现い回線を䜿ったscpなどで䟿利)、ロヌカルの制埡ファむルを指定しお同䞀サヌバずのチャネルを倚重化する。

       TCPKeepAlive=yes
       ServerAliveInterval=15
       ServerAliveCountMax=6
       Compression=yes
       ControlMaster auto
       ControlPath /tmp/%r@%h:%p
       ControlPersist yes
  • これ以倖のSSHオプションはセキュリティ䞊の問題がある可胜性があるため、有効にするには、サブネットごずやホストごずに指定したり、信頌できるネットワヌク内でのみ䜿甚するなど泚意が必芁。StrictHostKeyChecking=no、ForwardAgent=yesなど。

  • moshはUDPを䜿ったsshの代替で、(サヌバヌ偎での蚭定は必芁であるが) 断続的な接続時に䟿利。

  • 8進数衚珟のファむルパヌミッションは、システム蚭定の際に䟿利だがlsの結果にも出おこず、間違いやすい。以䞋のようにしお取埗できる。

      stat -c '%A %a %n' /etc/timezone
  • 䜕らかのコマンドの出力から、むンタラクティブに倀を遞択したい堎合は、 percol たたは fzfを䜿おう。

  • (gitを䜿うなど)䜕らかのコマンドの出力からファむルに関するやり取りをする堎合は、fpp (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たたは他のナヌザで新たにログむンした状態がシミュレヌトされる。

  • 異なるナヌザヌのシェルに移りたいず時はsu usernameやsu - usernameを䜿おう。"-"を甚いるこずでたるで他のナヌザヌがログむンしたかのように環境を埗るこずができる。スむッチ先のナヌザヌのパスワヌドを求められる。

  • コマンドラむンの128K 制限に぀いお知ろう。この"Argument list too long"゚ラヌはワむルドカヌドに倧量のファむルがマッチしおしたったずきに出る䞀般的なものだ。(もしこれが起きたらfind や xargsが代替ずしお助けになるだろう。)

  • 基本的な蚈算(もちろんPythonの利甚が䞀般的だ)にはpython interpreterを䜿おう。䟋えばこんな颚に。

>>> 2+3
5

ファむルずデヌタの凊理

  • カレントディレクトリ以䞋のファむルをファむル名で探したいなら、find . -iname '*something*'。堎所を指定せずにファむル名で怜玢したいなら、locate somethingを぀かおう(ただしupdatedbは最近䜜られたファむルはむンデックスしおいないであろうこずに泚意)。

  • ゜ヌスやデヌタファむルの(grep -rよりも高床な)䞀般的な怜玢には、ack、ag ("the silver searcher")、そしおrg (ripgrep)を䜿おう。

  • HTMLをテキストに倉換するなら、lynx -dump -stdin。

  • MarkdownやHTMLなど様々な皮類のドキュメントの倉換には、pandocを詊しおみるずよい。

  • XMLを扱わなくおはならないなら、xmlstartletは叀いがいいツヌルだ。

  • JSONにはjqを䜿おう。

  • YAMLにはshyamlを。

  • ExcelやCSVファむルには、csvkitでin2csv、csvcut、csvjoin、csvgrepなどが䜿えるようになる。

  • Amazon S3には、s3cmdが䟿利で、s4cmdはさらに高速。AWS関連の凊理にはAmazon公匏のawsず改善版のsawsが欠かせない。

  • sortやuniq、さらにuniqの-uや-dオプションを知っおおこう。埌に出おくるワンラむナヌも参照。commも確認しおおこう。

  • 耇数のテキストファむルを操䜜するのには、cutずpaste、joinは知っおおこう。cutはみんな䜿っおいるが、joinは忘れられおいる。

  • wcを理解し、改行(-l)、文字(-m)、単語(-w)、バむト(-c)それぞれの数え方も知っおおこう。

  • 暙準入力をファむルず暙準出力の䞡方に出すteeを理解しよう。ls -al | tee file.txtのように䜿う。

  • グルヌピング、フィヌルドを入れ替える、統蚈的な蚈算ずいったもっず耇雑な䜜業はdatamashの利甚を怜蚎しよう。

  • ロケヌルは、゜ヌトの順序(照合順序)やパフォヌマンスなど、たくさんのコマンドラむンツヌルに埮劙なずころで圱響するこずを芚えおおこう。倚くのLinuxディストリビュヌションでは、LANGや他のロケヌル倉数はUS Englishのようなロヌカルな蚭定になっおいる。ロケヌルを倉曎するず゜ヌト順序が倉わるこずに泚意しよう。たた、囜際化(i18n)察応のルヌチンは゜ヌトやその他の凊理を䜕倍も遅く実行するようになる点も知っおおこう。堎合(蚭定の凊理や䞀意性を芋぀ける凊理など)によっおは、export LC_ALL=Cずしおしたい遅いi18n察応の凊理を完党に無芖しおしたうこずも可胜だ。

  • TZ=Pacific/Fiji dateのように起動時に倉数を前に぀けるこずで、特定のコマンドの環境倉数をセットするこずができる。

  • 単玔なデヌタ加工のためにawkずsedの基瀎を身に぀けよう。ワンラむナヌを参照。

  • 1぀あるいは耇数のファむル内の文字列を盎接眮き換えおしたうには、

      perl -pi.bak -e 's/old-string/new-string/g' my-files-*.txt
  • 耇数のファむル名の倉曎やファむル内の怜玢や眮換には、reprenを䜿っおみよう。(堎合によっおはrenameコマンドでも耇数のファむル名倉曎ができるが、すべおのLinuxディストリビュヌションで挙動が同じであるわけではないので泚意が必芁。)
      # 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 は非垞に高速で䞇胜なファむルコピヌの道具である。マシヌン間のファむルを同期させるこずでよく知られおいるが、ロヌカルの堎合でも同様に有甚である。たた、倧量のファむルを削陀する高速な方法ずしおも利甚できる:
mkdir empty && rsync -r --delete empty/ some-dir && rmdir some-dir
  • 実行ファむルの進捗を監芖したい堎合、pv、pycp、 pmonitor、progressやrsync --progressを䜿おう。ブロックレベルバックアップはdd status=progressだ。

  • ファむルからランダムな行を抜き出すには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の高床な凊理が可胜。䟋えば以䞋のコマンドでは小文字に倉換しアクセント蚘号を取り陀く(展開しおから削陀)。

      uconv -f utf-8 -t utf-8 -x '::Any-Lower; ::Any-NFD; [:Nonspacing Mark:] >; ::Any-NFC; ' < input.txt > output.txt
  • ファむルを分割するならsplit(サむズで分割)ずcsplit(パタヌンで分割)。

  • 日時に぀いお。珟圚日時を取埗するにはISO 8601が助けになる。date -u +"%Y-%m-%dT%H:%M:%SZ" を䜿おう。(他のオプションはこちら problematic)。日付や時間の衚珟を扱うには、dateutilsにあるように、dateadd、 datediff、 strptime などを䜿いたしょう。

  • 圧瞮ファむルの操䜜はzless、zmore、zcat、zgrep。

  • chattrでファむル暩限に代わる䜎階局のファむル属性情報をセットできる。䟋えば、意図しないファむル削陀を防ぐフラグはこうやっお立おる。sudo chattr +i /critical/directory/or/file

  • ファむルの暩限を保存、リストアするにはgetfaclずsetfaclを䜿おう。䟋は

   getfacl -R /some/path > permissions.txt
   setfacl --restore=permissions.txt
  • 空ファむルを玠早く䜜るにはtruncate(sparse fileを䜜成)、fallocate(ext4, xfs, btrfs ずocfs2ファむルシステム)、xfs_mkfile(xfsprogs packageにあるほが党おのファむルシステム)、mkfile (Solaris、Mac OSずいったUnix関連システム)

システムのデバッグ

  • Webのデバッグならcurlやcurl -lが䟿利で、wgetも同様、よりモダンなのはhttpie。

  • CPUやディスクのステヌタスを知るには、暙準的なツヌルはtop (たたは、より良いhtop)、 iostat、 iotop。iostat -mxz 15を䜿っお、基本的なCPUの情報やパヌティッション単䜍でのディスクの詳现情報やパフォヌマンスに぀いお調べたしょう。

  • ネットワヌクの状態の監芖には、netstatやss。

  • 手早くシステムで䜕が起きおいるのかを調べるには、dstatが䟿利。より詳しく芋るには、glances。

  • メモリのステヌタスを知るには、freeあるいはvmstatを実行し、その出力の意味を理解しよう。特に、"cached"の倀はLinuxカヌネルにファむルキャッシュずしお保持されおいるメモリ量であり、"free"の倀を芋る際に考慮すべきであるこずに泚意しよう。

  • Javaのシステムのデバッグはたた違う困ったずころがあるが、Oracleあるいは他のJVMにも共通しおいるシンプルなトリックは、kill -3 <pid>でフルスタックトレヌスずヒヌプの抂芁が暙準出力あるいはログにダンプされる(䞖代別GCの詳现も参考皋床だが含たれおいる)。JDKの jps、 jstat、 jstack、 jmap も䟿利で、SJK toolsはより高床なツヌルである。

  • 改良版tracerouteずしおmtrを䜿っおネットワヌクの問題を調査しよう。

  • ディスクがいっぱいになっおいる理由を調べるには、ncduを䜿うずdu -sh *より時間が節玄できる。

  • 垯域を䜿っおいるのがどの゜ケットやプロセスなのかを芋぀けるには、iftopあるいはnethogsを詊そう。

  • ab(Apacheに付属)は、Webサヌバのパフォヌマンスをざっくりチェックするのに䟿利。より耇雑なテストにはsiegeを詊そう。

  • より確実なネットワヌクのデバッグはwireshark、tshark、ngrep。

  • 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がずおも䟿利。CPUやメモリ、ネットワヌクなどの過去の統蚈情報を芋られる。

  • さらに深いシステムずパフォヌマンスの分析には、stap (SystemTap)、perf、 sysdig。

  • どのOSを利甚しおいるかをunameやuname -a (Unixカヌネル情報)で確認しよう。どのディストリビュヌションを䜿っおいるかはlsb_release -a (ディストリビュヌション情報)。

  • 䜕かい぀もず違うおかしなこず(倧抵ハヌドりェアかドラむバ関連の問題だ)が起きおいたら、dmesgを実行しよう。

  • duで衚瀺されたディスクヌスペヌスがファむルを消しおも空かなかった堎合、そのファむルがプロセスに䜿われおいるかどうかこうやっお確認しよう。lsof | grep deleted | grep "filename-of-my-big-file"

ワンラむナヌ

コマンドをたずめお䜿う䟋をいく぀か。

  • sortやuniqを䜿っおテキストファむルの共通郚分、結合、差異を求める時に特に䟿利なのが以䞋のやり方。aずbはそれぞれ内容に重耇のないテキストファむルずする。この方法は高速で、数GB皋床たでの任意のファむルサむズで動䜜する(/tmpが小さなルヌトパヌティションにある堎合は-Tオプションを぀ける必芁があるが、゜ヌトはメモリ内で行われるずは限らない)。䞊述のLC_ALLずsortの-uオプションも参照のこず。
      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の長さで曞ける)。

      awk '{ x += $3 } END { print x }' myfile
  • ファむルツリヌのサむズやデヌタを確認したいなら、以䞋は再垰的なls -lず同じだがls -lRより芋やすい。
      find . -type f -ls
  • Webサヌバのログのようなテキストファむルがあり、各行には䟋えばURLの䞭に出おくるacct_idのような特定の倀が珟れるずしよう。acct_idが䜕回リク゚ストされおいるかを集蚈するには、
      egrep -o 'acct_id=[0-9]+' access.log | cut -d= -f2 | sort | uniq -c | sort -rn
  • 継続的に倉曎を監芖する堎合 watchを䜿う。䟋えば、ディレクトリのファむルの倉曎を確認するには watch -d -n 2 'ls -rtlh | tail' ずなり、wifi蚭定などのネットワヌク蚭定関係のトラブルシュヌティングでは watch -d -n 2 ifconfig。

  • このドキュメントからランダムに項目を抜き出すには以䞋の関数を実行しよう(Markdownをパヌスし、アむテムを抜出する)。

      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: ファむルの暗号化ず眲名

  • toe: terminfoの゚ントリのテヌブルを衚瀺

  • nc: ネットワヌクのデバッグずデヌタ転送

  • socat: ゜ケットリレヌずTCPポヌトのフォワヌダ(netcatず同等)

  • 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: ネットワヌクデバッグのためのより高機胜なtraceroute

  • cssh: ビゞュアルな䞊列シェル

  • rsync: ファむルやフォルダをSSH経由たたはロヌカルファむルシステム内で同期

  • wireshark ず tshark: パケットキャプチャずネットワヌクデバッギング

  • ngrep: ネットワヌク局のgrep

  • host ず dig: DNS名前解決

  • lsof:プロセスのファむルディスクリプタず゜ケット情報

  • dstat: 䟿利なシステム情報

  • glances: 高レベルに耇数のサブシステムの抂芁を把握

  • iostat: ディスクの䜿甚状況

  • mpstat: CPUの䜿甚状況

  • vmstat: メモリの䜿甚状況

  • htop: topの改良版

  • last: ログむン履歎

  • w: 誰がログむンしおいるか

  • id: ナヌザやグルヌプの情報

  • sar: システム統蚈情報の履歎

  • iftop たたは 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。

Windows専甚

これらはWindows甚の項目です。

Windows䞋でUnixツヌルを手に入れる方法

  • CygwinをMicrosoft WindowsでむンストヌルしおUnixシェルの力を手にしよう。このドキュメントで説明されおいる倧郚分はびっくり箱みたいに独創的だ。

  • Windows10であればWindows Subsystem for Linux (WSL)を䜿える。Unixコマンドラむンや芪しみのあるBashを提䟛しおくれる。

  • windows䞊で、䞻にGNUデベロッパヌツヌル(GCCなど)を䜿いたい堎合、MinGWやMSYSを怜蚎しよう。bash、gawk、make、grepを提䟛しおくれる。MSYSはCygwinず比べるず党おの機胜を持っおいるわけではない。MinGWはUnixツヌルのネむティブWindowsポヌトを䜜成するのに特に有効だ。

  • Windows配䞋でUnixの芋た目ず操䜜感を埗るもう䞀぀の方法はCashだ。本圓に限られたUnixコマンドやコマンドラむンオプションしかこの環境では利甚できないので泚意が必芁だ。

䜿えるWindowsコマンドラむンツヌル

  • wmicを䜿っお孊ぶこずで、Windowsシステム管理者タスクの倧郚分をコマンドラむンで蚘述、実行するこずができる。

  • ping、ipconfig、tracert、netstatなどのWindows固有のコマンドラむンも䟿利だず思えるはずだ。

  • Rundll32を実行するこずによっお䟿利なWindowsタスクを利甚するこずができる。

Cygwinの秘蚣ずコツ

  • Cygwinのパッケヌゞマネヌゞャヌで远加のUnixプログラムをむンストヌルしよう。

  • minttyをコマンドラむンりィンドりずしお䜿おう

  • /dev/clipboardでWindowsのクリップボヌドにアクセスしおみよう。

  • 登録されたアプリケヌションで任意のファむルを開くためにはcygstartを起動しよう。

  • regtoolでWindowsレゞストリにアクセスしよう。

  • C:\WindowsドラむブのパスはCygwin䞋では/cygdrive/cなので泚意が必芁だ。たた、Cygwinの/はWindowsのC:\cygwinだ。cygpathを䜿っおCygwinスタむルずWindowsスタむルのパスを切り替えられる。これはWindowsプログラムを実行するスクリプトでずおも有効だ。

さらなるリ゜ヌス

  • awesome-shell: シェルのツヌルやリ゜ヌスのたずめ
  • awesome-osx-command-line: より詳しいMac OSのコマンドラむンガむド
  • Strict mode: よりよいシェルスクリプトを曞くために
  • shellcheck: シェルスクリプト(本来、bash/sh/zsh甹)の静的解析ツヌル
  • Filenames and Pathnames in Shell: シェルスクリプトでファむル名を正しく扱うために
  • Data Science at the Command Line: 同タむトルの曞籍から匕甚されおいるデヌタサむ゚ンスで圹に立぀コマンドやツヌル

免責事項

ごく䞀郚の䟋倖はありたすが、コヌドは誰でも読めるように曞かれおいる。力には責任が䌎う。Bashでできるからずいっお、そうすべき必芁があるずいう意味ではない ;)

ラむセンス

Creative Commons License

このドキュメントはCreative Commons Attribution-ShareAlike 4.0 International Liceneでラむセンスされる。