はじめまして!スカイアーチの鯖管になるために、現在修行をしている新卒の幕田です。大学ではコンピュータ理工学部でプログラミング、ネットワーク、ハードウェアなどのITの基礎を学びました。Linuxは簡単な使い方を知っている程度です。
今月に入り、研修でLinuxに触れ始めました。そこで壁にぶつかりました。「コマンドがわからない」「おぼえられない」というものです。なので、「実際に打って覚える」「楽しく続けられそう」この条件を満たす勉強方法を探すことにしました。
そんなとき、友達が”シェル芸”なるものについて語っていたのを思い出しました。これだ!と思い、最近シェル芸を始めました。
ということで、今回はシェル芸について紹介を書こうと思います。
そもそもシェル芸とは?こちら(http://blog.ueda.asia/?tag=シェル芸の定義)で定義について書かれています。定義をリンク先から引用させていただくと、
マウスも使わず、ソースコードも残さず、GUIツールを立ち上げる間もなく、あらゆる調査・計算・テキスト処理をCLI端末へのコマンド入力一撃で終わらすこと。
すごいかっこいい!
そして、シェル芸についていろいろ調べていたら、危険な技、”危険シェル芸”というものを見つけました。私が「なるほど!」と思ったものっを、いくつかご紹介します。
rm -rf temp /* テンポラリを削除 */
これは最初何が危険なのかわからなかったもの。プログラマだと/* テンポラリを削除 */ の部分をコメントアウトと認識してしまいがちですが、冷静に考えれば、シェルのコメントアウトは#です。つまり、これは
1 |
$ rm -rf temp |
1 |
$ rm -rf /* |
1 |
$ rm -rf テンポラリを削除 |
1 |
$ rm -rf */ |
を行なう処理になり、その中には危険な操作rm -rf /*があるので、ルートディレクトリから全て消されてしまうわけです。むやみに実行したら危険です。
:(){: | : &};:
検索したらwikipediaに説明がありました。
http://ja.wikipedia.org/wiki/Fork%E7%88%86%E5%BC%BE
fork爆弾というやつらしいです。引用させていただきます。
これはまず、先頭の ":()" は ":" という関数(引数なし)を定義することを宣言している。続く "{ :|:& };" がその本体で、自分自身を2つ起動してパイプでつなぎ、バックグラウンドで実行することを意味する。バックグラウンドなので、親プロセスをkillしても子プロセスは終了しない。最後の ":" がその関数の実行開始を意味する。この文字列は関数名を ":" として意味をわかりにくくしている。これをもっと判りやすい名前に置換すると次のようになる。
1 |
forkbomb(){ forkbomb|forkbomb & } ; forkbomb |
なるほど!これは危険ですね。
今回は危険なものをメインに紹介しましたが、もちろん便利なシェル芸もあります。今回は省略致します。
とりあえず、私も勉強がてらワンライナーで”危険じゃない”シェルを作ってみました。
研修でやったRSA暗号の話で「素数」が出たので、素数を出してくれるシェルを作りました。素数をだすアルゴリズムは知っていたので、どうやってシェルで書くかというところが問題でした。
調べたところ、jot という連番・ランダムな数字を出してくれるコマンドがあったのでjotを軸に、いろいろ試行錯誤した結果こうなりました。
1 |
jot 1000|awk '{for(j=2;j*j<=$1;j++){if($1%j==0){break;}}if($1!=1&&$1<j*j){printf $1 " ";}}'|xargs |
あんまりシェルでやった感が出ませんでした。
ということで、もっとシェルなモノ探したら見つかりました。
1 |
yes</code> <code>|</code> <code>awk</code> <code>'{print NR}'</code> <code>| factor |</code> <code>awk</code> <code>'$NF==2{print $1}' |
奥が深いです。。。
初めのうちはコツをつかむのに時間がかかるかもしれませんが、やってるとハマりそうです!
ということで、もっと知りたい方は”シェル芸”で検索してみてください!
投稿者プロフィール
-
2024 Japan AWS Top Engineers
AWSを使ったサーバレスアーキテクチャ・コンテナサービスの設計・構築を担当。