じゃあ、おうちで学べる

本能を呼び覚ますこのコードに、君は抗えるか

$ :(){: | :};: がなぜ危険なのか…

自分用の危険シェル芸メモ

 

で、今回は危険シェル芸界隈でもっともお馴染みのこのコマンド

$ :(){: | :};:

↑どういう処理をしてなぜ、危険なのかを解説していく中で危険シェル芸の神秘の世界を体験していただければとおもいます。

※この記事のコマンド表記は、bashではこのまま実行できない構文になっています。後半は当時の実行を振り返る記録ですが、実行した文字列の正確な表記はこの記事から確認できません。プロセスを再帰的に増やす危険な仕組みなので、実行せず説明として読んでください。

$ :(){: | :};: よくよく見るとかわいい

しかし、甘く見てはいけない

映画、マトリックスのエージェント のように次々と迫ってくる恐ろしい危険シェル芸なのだ!!!

では、構成要素の解説していきます。

:

何もしない! 何もせずに終了ステータス0(つまり正常終了)を返します。

( )

この例の:()は関数定義の括弧です。別の構文である(コマンド)はサブシェルで実行します。その中での変数の代入などは親のシェルに引き継がれませんが、ファイルへの書き込みなどは残ります。

{ }

この例の波括弧は、関数で実行するコマンドをまとめています。bashでは波括弧をコマンド本体から区切り、最後のコマンドをセミコロンや改行で終える必要があります。GNU Bashの関数定義の説明を参照してください。

 |

コマンドの実行結果を次のコマンドの入力として処理する。

 

構成要素の説明は以上です。

ここまで説明を見てコイツのどこが危険なんだ!!と思われるかもしれません。

$ :(){: | :};:

なので、実際に動かしてみます。下書きを保存して

 

いざ、、、、、、、、、、、、。

===========================================

実施してみました。直後、あれ??何も起こらないぞ??大丈夫か??と思った

その、瞬間に毒が身体に回ったかのように死にました。

途中 Ctrl+Cを押すと

[1] .....   : | :

こういう遺書がありました。

============================================

 

では、解説の続きです。

カレントシェルで : | : が実行されているということが分かります。

つまり、

:()

で”:”という関数を定義して

: | :

を呼び出してこれを、永遠に無限生成しているようです。