じゃあ、おうちで学べる

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

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

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

 

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

$ :(){: | :};:

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

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

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

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

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

:

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

( )

サブシェルを起動してコマンドを実行する。()の中で実行したコマンドは別プロセスで実行されるので、起動したスクリプト内には何も影響を与えない。

{ }

「変数の展開」と 「一連のコマンドをカレントシェルで実行する」の2種類の意味がある。必ずセミコロン(;)で終端する必要がある。

 |

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

 

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

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

$ :(){: | :};:

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

 

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

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

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

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

途中 Ctrl+Cを押すと

[1] .....   : | :

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

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

 

では、解説の続きです。

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

つまり、

:()

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

: | :

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