"Learn 10 good UNIX usage habits"を勉強してみた

Learn 10 good UNIX usage habits

ださいコマンドの使い方をやめてましょうって感じ。半分ぐらいは当たり前のような…。

  1. Make directory trees in a single swipe.
  2. Change the path; do not move the archive.
  3. Combine your commands with control operators.
  4. Quote variables with caution.
  5. Use escape sequences to manage long input.
  6. Group your commands together in a list.
  7. Use xargs outside of find.
  8. Know when grep should do the counting ++ and when it should step aside.
  9. Match certain fields in output, not just lines.
  10. 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

ん〜これは素晴らしい。

Stop piping cats

ファイルをcatしてパイプ通してgrepするな、最初からgrepしろ。うん、これは当然。


以上、適当に検証してたんで、ほとんどまとまってませんが('A`)
1.と9.は使えそうかな。