Bashの上で便利なコマンドたち

現在のLinuxの標準シェルはbashですけど、使いこなせてるとは思っていない。
けど使えていないとは思わない。まぁだから便利に使えていると言うことです。
shことBourne Shellでも足りそうですけどね。ちなみにbashはBourne Again Shellね。
シェルスクリプトでいろいろやるなら知らないけど、まぁさすがにそれはしないし。
工作するだけならPerlの方が強力ですからね。実はLinuxの世界ではシェルスクリプトと共にPythonとPerlはよく使われている。
最近Pythonの力が強いですねぇ…まぁこれはどうでもいいことだけど。


bashはWindowsでもCygwin上でよく触れる。
いろいろ有用な使い方はあるけど、実はPerlの動作にはCygwinのPerlを使ってる。
そう、ActivePerlじゃないんだ。
で、Perlのスクリプトをechoコマンドで作ろうというアホな試みをしたことがある。
結論から言えば大失敗なんだけど…
なぜかというと、まず1つはダブルクオーテーションマークのこと。
もう1つは!の取り扱いのこと。
ところでechoコマンドで文書を作成するというのだけでも驚く人は多いかも知れない。
実はあまり珍しいことではない。たとえば、”foo”という文字列のmd5を取りたいときすることは

$ echo -n "foo"|md5sum

慣れればそんなもんだが、なかなか慣れないかもしれない。
echo -nは改行コードを入れないで引数をオウム返し、それで引数にはfooを指定したと。
これをパイプでわたして、md5sumを取ってると。
パイプで渡すという行為は、一旦ファイルに書き出して、それを次のコマンドで読み取る行為に一見似ている。
そういう便利な機能を使うことで、効率よく物事をできる。
非常に長い結果をlessコマンドで短く区切って読んだり、grepで物を探したり。
以前やってたのが、

# rpm -qa | grep foo | less

みたいなこと。rpm -qaはすべてのインストールされてるやつが出てくるから、grepで検索して、lessで短くして読むと。
lessの方が一般的だけど、僕はmoreの方が好きだな。moreは低機能だけど、意外といい。
あと、リダイレクトという機能は結構便利。
出てくる情報をファイルに書き出すという機能だが、自作プログラムでファイル入出力を簡略化するのにたまにやることがある。

$ grep foo < in.txt
$ echo "foo" > out.txt
$ echo "add" >> out.txt

まず、ファイルを入れるということだが、<の後にファイル名を付けるだけで標準入力から入れたことになる。
パイプの説明のときすっ飛ばしたけど、標準入出力というのがありまして、標準入力はキーボード、標準出力・標準エラー出力は画面につながってます。
それで、パイプは前のコマンドの標準出力を次のコマンドの標準入力につなげると。
で、この標準入出力はWindowsにいてもあまり意識しないけど、Linuxでは使いまくる。
grepの場合、ファイル内を検索するときには

$ grep foo in.txt

でもいい。というかそっちの方がよさげ。
けどこんな書き方も悪くない。
>も>>も標準出力をファイルに書き出すという効果は同じ。>はファイルを改めて、>>はファイルに追記するという違いがある。
実はこの機能は簡単なテキストファイルの作成にも使える。というのは頭の方で書いたな。
echoでつらつら書いて、リダイレクトでファイルを作ってしまう。意外と便利。
このリダイレクトの先はいろいろあるけど、/dev/nullに書き出すというのは使える。

$ ./foo >/dev/null 2>&1
$ dd if=/dev/random count=1 2>/dev/null | md5sum

1つ目のはcrontabでよく使われるよな。
cronの自動実行はなんか出力があればrootにメールを送ってくる。だからそれを阻止するためにこうすることがある。
で、どういうことかというと、まず標準出力を/dev/nullに捨てる。
捨てるという表現を使うのは、ここに入ってきたものは何もされずに捨てられるから。すなわち画面に出ないということ。
その次の2>&1というのは慣れない表現。2>は2番、標準エラー出力をどっかにリダイレクトするという意味。
そして&1は1番、標準出力と同じところに渡すと言うこと。だからこれも/dev/nullに捨てられる。
これの応用例というのが次ので、ddコマンドで、ランダムなデータを作成して、標準出力に出している。これをパイプでmd5sumに送る。
しかし、それではddコマンドの実行結果が標準エラー出力から画面に出てしまう。だから、標準エラー出力だけ捨てたと。


さて、初めの話に戻る。
このechoコマンドというのでいろいろ書こうと思ったのだが、都合が悪い。
それで偶然こんなものを見つけた。ヒアドキュメント。
使い方はさほど難しくない。

$ cat << EOF >foo.pl
#!/usr/bin/perl
while(<>){print;}
EOF

ヒアドキュメントというのは何かと都合の悪い複数行の標準入力の書き方。
それで行を改める。それでつらつら書いていって、最後に1行、EOFだけ書く、これだけ。
ちなみにcatは標準入力を標準出力に接続するだけのコマンド。ただのオウム返し。
あと、引数にファイルを指定すると標準出力に出してくれるので、簡易テキストビュワーになる。
そして今日簡易テキスト作成装置にもなることがわかった。
意外と便利なもんですね。