Umi Uyuraのブログ

プログラミング関連の作業ログ

コマンドラインのチートシート管理ツール「Cheat」

先日、Twitterを眺めていて、tldrというコマンドを知りました。

man は長すぎるので「tldr」

これは便利、とさっそく導入したのですが、どうせなら自分で使うパターンを登録できるものがないものかと思って探してみたところ、Cheatというツールを発見しました。というか、 tldrのGitHubリポジトリのREADME で紹介されていました。

chrisallenlane/cheat

基本的にはtldrと同様、指定したコマンドのよくある使い方のようなものを表示してくれるものですが、それ以外にも表示内容を編集したり、新しいコマンドの使い方を追加することができる、というものです。

インストール

Homebrewで入れることができます。

$ brew install cheat

コマンド自体はPythonで作られているようなので、 pip でもインストールできるようです。

使い方

チートシートの表示 cheat <command>

引数として、使い方を知りたいコマンドを渡すことで、その主だった使い方を表示します。

例えば curl の使い方例を観たい場合は、以下のように実行します。

$ cheat curl
# Download a single file
curl http://path.to.the/file

# Download a file and specify a new filename
curl http://example.com/file.zip -o new_file.zip

...

チートシートの編集 cheat -e <command>

エディタが起動して、表示内容を編集することができるようになります。

環境変数 EDITOR を参照しているようです。

自分はよく curl でリダイレクトも辿ってダウンロードをするオプションを忘れるので、 curl のチートシートを編集して、以下の例を追記しておきました。

# Follow the redirect
curl -L http://example.com/file

パーミッションに注意

私の環境では cheat -e したときに、読み取り専用状態で開かれました。

Homebrewで導入すると、オリジナルのチートシートファイルは /usr/local/Cellar/cheat/2.1.18/lib/python2.7/site-packages/cheat/cheatsheets/ といったパスにコマンド単位で格納されているようなのですが、そのオリジナルを保護するためか、各ファイルは読み取り専用になっていましたので、そのためかと思います。

この場合は、編集後に別名保存して、必要なら chmod で書き込み権限を付与すればOKです。

なお、編集した個人用のチートシートは、デフォルトでは ~/.cheat というパスに保存されるようです。これを変更したい場合は、 DEFAULT_CHEAT_DIR という環境変数を設定すれば良いようです。

チートシートの検索 cheat -s <keyword>

指定したキーワードを含むチートシート内を検索することができます。

例えば キーワードとして awk を検索すると、以下のように出力されます。

$ cheat -s awk
awk:
  printf '1\n2\n3\n' | awk '{ sum += $1} END {print sum}'
  printf '1:2:3' | awk -F ":" '{print $1+$2+$3}'
  seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'
  printf '1 2 3' | awk 'BEGIN {OFS=":"}; {print $1,$2,$3}'

find:
  find . -type f -size +20000k -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'

history:
  history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10

netstat:
  netstat -pln | grep <port> | awk '{print $NF}'

openssl:
  awk '/-----BEGIN/,/END CERTIFICATE-----/' | \

awk の使用例のほか、内部的に awk を使っているケースもヒットするので、コマンドの勉強にもなるかもしれません。

チートシートの一覧 cheet -l

こんな感じで、ズラズラっと表示されます。

7z               /usr/local/Cellar/cheat/2.1.18/lib/python2.7/site-packages/cheat/cheatsheets/7z
ab               /usr/local/Cellar/cheat/2.1.18/lib/python2.7/site-packages/cheat/cheatsheets/ab
apk              /usr/local/Cellar/cheat/2.1.18/lib/python2.7/site-packages/cheat/cheatsheets/apk
apparmor         /usr/local/Cellar/cheat/2.1.18/lib/python2.7/site-packages/cheat/cheatsheets/apparmor
apt-cache        /usr/local/Cellar/cheat/2.1.18/lib/python2.7/site-packages/cheat/cheatsheets/apt-cache
apt-get          /usr/local/Cellar/cheat/2.1.18/lib/python2.7/site-packages/cheat/cheatsheets/apt-get
aptitude         /usr/local/Cellar/cheat/2.1.18/lib/python2.7/site-packages/cheat/cheatsheets/aptitude
asciiart         /usr/local/Cellar/cheat/2.1.18/lib/python2.7/site-packages/cheat/cheatsheets/asciiart
asterisk         /usr/local/Cellar/cheat/2.1.18/lib/python2.7/site-packages/cheat/cheatsheets/asterisk
...

上記だとチートシート自体のパスも出力されていて少し見にくいので、コマンドだけ抽出すると、2/9時点(Cheat 2.1.18)で、以下のとおりでした。

7z, ab, apk, apparmor, apt-cache, apt-get, aptitude, asciiart, asterisk, at, awk, bash, bower, chmod, chown, convert, crontab, csplit, cups, curl, cut, date, dd, df, dhclient, diff, distcc, dnf, docker, dpkg, du, emacs, ffmpeg, find, gcc, gdb, git, gpg, grep, gs, gzip, hardware-info, head, history, hub, ifconfig, indent, ip, iptables, irssi, iwconfig, journalctl, jq, jrnl, less, lib, ln, ls, lsof, lvm, man, markdown, mkdir, more, mount, mysql, mysqldump, nc, ncat, netstat, nmap, notify-send, nova, ntp, numfmt, od, openssl, p4, pacman, paste, pdftk, php, ping, ping6, pip, ps, python, readline, rm, route, rpm, rss2email, rsync, sam2p, scp, screen, sed, shred, smbclient, snmpwalk, sockstat, sort, split, sqlmap, ss, ssh, ssh-copy-id, ssh-keygen, stdout, strace, systemctl, systemd, tail, tar, tcpdump, tee, tmux, top, tr, truncate, udisksctl, uname, uniq, unzip, vagrant, vim, weechat, wget, xargs, yaourt, youtube-dl, yum, zip, zoneadm

面倒くさいので両方使いたい

ところで、同じタイミングのtldrの対応コマンドは以下のとおり。

※tldrは様々な言語・プラットフォームのものが用意されていますが、自分的に導入しやすいNode.js版を使っています。

7za, ab, ack, adb, ag, alias, apropos, ar, aria2c, arp, atom, autojump, autossh, awk, axel, bash, bashmarks, bc, bmaptool, bundle, cal, calibre-server, calibredb, cat, cd, chmod, chown, chsh, cksum, clang, comm, convert, convmv, cordova, cowsay, cp, csvclean, csvcut, csvformat, csvgrep, csvlook, csvpy, csvsort, csvstat, curl, cut, date, deluser, df, dhcpwn, diff, dig, docker, dokku, drush, ebook-convert, echo, electrum, emacs, enca, env, espeak, exiftool, fdupes, ffmpeg, file, find, for, fortune, fswebcam, fzf, gcc, gem, gifsicle, git-add, git-blame, git-branch, git-checkout, git-clone, git-commit, git-config, git-diff, git-fetch, git-init, git-log, git-merge, git-mv, git-pull, git-push, git-rebase, git-remote, git-rm, git-stash, git-status, git-svn, git-tag, git, glances, gpg, gradle, grep, gzip, handbrakecli, haxelib, history, host, iconv, if, ifconfig, in2csv, ionice, ioping, ipcs, jar, java, javac, kill, last, latexmk, less, license, ln, lp, lpstat, ls, lsof, lwp-request, mailx, make, man, mitmproxy, mkdir, mocha, montage, more, mount, mp4box, mtr, mv, mysql, mysqldump, nano, nc, nginx, nice, nix-env, nmap, node, nohup, npm, nvm, openssl, optipng, pandoc, parallel, pass, passwd, paste, patch, pdflatex, pg_dump, pg_restore, pgrep, php, phpize, phpunit, pigz, ping, pip, pkill, play, pngcrush, printf, ps, psql, pushd, pv, pwd, python, read, redis-cli, redshift, rename, renice, rm, rmdir, route, rsync, sails, salt-call, salt-key, salt-run, salt, sass, scp, screen, sed, seq, sftp, shred, skicka, sl, socat, sort, sox, split, srm, ssh-keygen, ssh, sshfs, strings, su, sudo, sum, svn, tabula, tac, tail, tar, tcpdump, tee, telnet, test, time, tldr, tldrl, tmux, touch, tr, traceroute, transcode, tree, ufraw-batch, umount, uname, uniq, unrar, unzip, uptime, vagrant, vim, vimtutor, virtualenv, w, watch, wc, wget, which, while, who, whoami, x_x, xargs, xz, yes, youtube-dl, zbarimg, zcat, zdb, zfs, zip, zless, zpool, airport, archey, base64, brew, caffeinate, dd, diskutil, ditto, drutil, du, head, hostname, locate, md5, mdfind, netstat, networksetup, nm, open, pbcopy, pbpaste, qlmanage, route, say, shutdown, sw_vers, sysctl, system_profiler, systemsetup, top, w, wacaw, xctool, xed, xsltproc

tldrの方がサポートしているコマンドは多く、またCheatと違ってチートシートの内容のみアップデートできる( tldr -u )ので、今後もまだまだ増えていきそう。

よって普段使い的にはtldrの方がヒットする率が高そうですが、Cheatは自分用のチートシートを用意できるのが便利。

ということで、両方呼び出すシェルスクリプトを作って使うことにしました。

以下のgistを実行権限付きでPATHが通った場所に保存して、 how <command> で使えます。

実行すると、以下のような感じで cheat と tldr 両方の結果を出力します。

$ how curl
======================================= cheat
# Download a single file
curl http://path.to.the/file

# Download a file and specify a new filename
curl http://example.com/file.zip -o new_file.zip

# Follow the redirect
curl -L http://example.com/file

...

======================================== tldr

  curl
  Transfers data from or to a server.
  Supports most protocols including HTTP, FTP, POP.

  - Download a URL to a file:
    curl "URL" -o filename

  - Send form-encoded data:
    curl --data name=bob http://localhost/form

  - Send JSON data:
    curl -X POST -H "Content-Type: application/json" -d '{"name":"bob"}' http://localhost/login

...

参考

すべてのUNIXで20年動くプログラムはどう書くべきか デプロイ・保守に苦しむエンジニア達へ贈る[シェルスクリプトレシピ集]

すべてのUNIXで20年動くプログラムはどう書くべきか デプロイ・保守に苦しむエンジニア達へ贈る[シェルスクリプトレシピ集]