Learn 10 good UNIX usage habits
ださいコマンドの使い方をやめてましょうって感じ。半分ぐらいは当たり前のような…。
- Make directory trees in a single swipe.
- Change the path; do not move the archive.
- Combine your commands with control operators.
- Quote variables with caution.
- Use escape sequences to manage long input.
- Group your commands together in a list.
- Use xargs outside of find.
- Know when grep should do the counting ++ and when it should step aside.
- Match certain fields in output, not just lines.
- Stop piping cats.
Make directory trees in a single swipe.
- bad habit
tmpディレクトリがないときに、aやらbやらを作ろうとするとエラーになるけど、それを一々作るのはださい。
~ $ mkdir tmp ~ $ cd tmp ~/tmp $ mkdir a ~/tmp $ cd a ~/tmp/a $ mkdir b ~/tmp/a $ cd b ~/tmp/a/b/ $ mkdir c ~/tmp/a/b/ $ cd c ~/tmp/a/b/c $
- good habit
-pオプションつければ一発
~ $ mkdir -p tmp/a/b/c
mkdirhierコマンドならtmpディレクトリがなくてもエラーが出なくて便利。
~ $ mkdirhier tmp/a/b/c
Change the path; do not move the archive
tarアーカイブは通常カレントディレクトリに展開される。だからって*.tarを移動するのはやめましょうっていう。
- good habit
-Cオプションで展開するディレクトリを指定する。
~ $ tar xvf -C tmp/a/b/c newarc.tar.gz
ただ、うちの環境(ubuntu + zsh)だと↑の引数の取り方だとダメで、↓こうやらないとダメだった。
$ tar xvf newarc.tar.gz -C tmp/a/b/c
Combine your commands with control operators
コマンドを連結して実行するときは";"(セミコロン)じゃなくて、コマンドの実行ステータスを利用して"$$"か"||"を使いましょうって感じ?
- good habit
~ $ cd tmp/a/b/c && tar xvf ~/archive.tar
これならcdが成功したときだけtarで展開する。
~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c
cdが失敗したときはmkdirする。これはmakeのときに良くやるので結構メジャーですね。
$ ./configure $ make && make install
ちなみにListing 7. のtarの引数はたぶん間違ってますよね?初めにcdしてたらtarで展開するディレクトリを相対パスで指定したらダメじゃん。
Quote variables with caution
シェルの変数を"で囲ったらうんたらかんたらって話。ですが、何がgoodなのか良くわからんのでスルー('A`)
Use escape sequences to manage long input
長すぎるコマンドは"\"でエスケープして改行ましょう。ってそんだけかよ Σ('A`)
Group your commands together in a list
"()"でコマンドをグループ化する?あんまメリットを感じられないんですが('A`)
()内のコマンドは子シェルを起動して実行されるから、現在のシェルには影響出ませんよ。それをもっと有効に使えってことですかね。
$ (cd ../; pwd) /home $ pwd /home/hoge
Use xargs outside of find
これも何が言いたいか良くわからんかった。ただ、xargsは(特にfindと組み合わせて)使い方次第ですごい便利になるのは確か。
Know when grep should do the counting -- and when it should step aside
grepでマッチする行数を数えるために、パイプ通してwcするのはやめよう。-cオプションで数えれるじゃないか。っていうことですかね。これはごもっとも。特に、複数のファイルを指定したときに、wcだと合計数をカウントする。けど、grep -cだと個別にカウントできる。
ただ、マッチする行数じゃなくて、出てくる単語数をカウントするときは
~ $ grep -o and tmp/a/longfile.txt | wc -l 3402
と、-oオプションを通してからwcするのはgood habitだそうで。
Match certain fields in output, not just lines
特定のフィールドでマッチングしたい時はgrepよりawk使いましょう。
- bad habit
~/tmp $ ls -l /tmp/a/b/c | grep Dec -rw-r--r-- 7 joe joe 12043 Jan 27 20:36 December_Report.pdf -rw-r--r-- 1 root root 238 Dec 03 08:19 README -rw-r--r-- 3 joe joe 5096 Dec 14 14:26 archive.tar
12月の更新日のファイルを検索するつもりが、ファイル名に"Dec"が含まれているので、余計なものまでマッチしてしまっている。
- good habit
awkを使うと解決。
~/tmp $ ls -l | awk '$6 == "Dec"' -rw-r--r-- 3 joe joe 5096 Dec 14 14:26 archive.tar -rw-r--r-- 1 root root 238 Dec 03 08:19 README
ん〜これは素晴らしい。