シェル芸はじめました

はじめまして!スカイアーチの鯖管になるために、現在修行をしている新卒の幕田です。大学ではコンピュータ理工学部でプログラミング、ネットワーク、ハードウェアなどのITの基礎を学びました。Linuxは簡単な使い方を知っている程度です。

今月に入り、研修でLinuxに触れ始めました。そこで壁にぶつかりました。「コマンドがわからない」「おぼえられない」というものです。なので、「実際に打って覚える」「楽しく続けられそう」この条件を満たす勉強方法を探すことにしました。

そんなとき、友達が”シェル芸”なるものについて語っていたのを思い出しました。これだ!と思い、最近シェル芸を始めました。

ということで、今回はシェル芸について紹介を書こうと思います。

そもそもシェル芸とは?こちら(http://blog.ueda.asia/?tag=シェル芸の定義)で定義について書かれています。定義をリンク先から引用させていただくと、

マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、あらゆる調査・計算・テキスト処理をCLI端末へのコマンド入力一撃で終わらすこと。

すごいかっこいい!

そして、シェル芸についていろいろ調べていたら、危険な技、”危険シェル芸”というものを見つけました。私が「なるほど!」と思ったものっを、いくつかご紹介します。

 

rm -rf temp /* テンポラリを削除 */

これは最初何が危険なのかわからなかったもの。プログラマだと/* テンポラリを削除 */ の部分をコメントアウトと認識してしまいがちですが、冷静に考えれば、シェルのコメントアウトは#です。つまり、これは

$ rm -rf temp
$ rm -rf /*
$ rm -rf テンポラリを削除
$ rm -rf */

を行なう処理になり、その中には危険な操作rm -rf /*があるので、ルートディレクトリから全て消されてしまうわけです。むやみに実行したら危険です。

 

:(){: | : &};:

??この記号の羅列はなんでしょう。

検索したらwikipediaに説明がありました。

http://ja.wikipedia.org/wiki/Fork%E7%88%86%E5%BC%BE

fork爆弾というやつらしいです。引用させていただきます。

これはまず、先頭の “:()” は “:” という関数(引数なし)を定義することを宣言している。続く “{ :|:& };” がその本体で、自分自身を2つ起動してパイプでつなぎ、バックグラウンドで実行することを意味する。バックグラウンドなので、親プロセスをkillしても子プロセスは終了しない。最後の “:” がその関数の実行開始を意味する。この文字列は関数名を “:” として意味をわかりにくくしている。これをもっと判りやすい名前に置換すると次のようになる。

forkbomb(){ forkbomb|forkbomb & } ; forkbomb

なるほど!これは危険ですね。

今回は危険なものをメインに紹介しましたが、もちろん便利なシェル芸もあります。今回は省略致します。

 

とりあえず、私も勉強がてらワンライナーで”危険じゃない”シェルを作ってみました。

研修でやったRSA暗号の話で「素数」が出たので、素数を出してくれるシェルを作りました。素数をだすアルゴリズムは知っていたので、どうやってシェルで書くかというところが問題でした。

調べたところ、jot という連番・ランダムな数字を出してくれるコマンドがあったのでjotを軸に、いろいろ試行錯誤した結果こうなりました。

jot 1000|awk '{for(j=2;j*j<=$1;j++){if($1%j==0){break;}}if($1!=1&&$1<j*j){printf $1 " ";}}'|xargs

あんまりシェルでやった感が出ませんでした。

ということで、もっとシェルなモノ探したら見つかりました。

yes | awk '{print NR}' | factor | awk '$NF==2{print $1}'

 

奥が深いです。。。

初めのうちはコツをつかむのに時間がかかるかもしれませんが、やってるとハマりそうです!

ということで、もっと知りたい方は”シェル芸”で検索してみてください!

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.