次のスクリプトが自分自身を削除するのはなぜですか?


84

次の内容の実行可能ファイルを作成して実行すると、それ自体が削除されます。
これはどのように作動しますか?

#!/bin/rm


@DigitalTrauma Heh、これを見たとき、それが私の最初の考えでした。

についてrmではなく、について#!です。質問は、実行可能なスクリプトがどのように動作するかを言い換えることができます#!
njzk2

1
どうやってこれにつまずいたのですか?
user1717828

1
それは間違いなく壮大な質問です。一度だけ投票できることを残念に思います。
ダニラカイバー

回答:


112

カーネルはで始まる行を解釈し、#!それを使用してスクリプトを実行し、スクリプトの名前を渡します。だからこれは実行されてしまいます

/bin/rm scriptname

スクリプトを削除します。通り(ステファンChazelasが 指摘しscriptnameそうでないものは何でもパスで発見された、それは、あるように渡された、あなたは、相対パスまたは絶対パスを指定した場合-ここにスクリプトを見つけるのに十分であるPATH、あなたがあれば、おそらくemptry文字列を含む、先頭に追加されたPATHことが含まれており、スクリプトは現在のディレクトリにあります。エコースクリプトを試し#!/bin/echoてみてください— —この仕組みを確認してください。

ホッブズは指摘し、これはあなたのスクリプトが実際にあることを意味しrm、スクリプトではなく、bash後者で始まるだろう-スクリプト#!/bin/bash

Linuxでの動作の詳細については、プログラムの実行方法をご覧ください。その記事のコメントは、他のプラットフォームの詳細を示しています。#!はシバンと呼ばれ、その用語を検索することで多くの情報を見つけることができます(提案についてはアーロンに感謝します)。以下のようJLPは指摘し、あなたも、それは「ポンドバン」や「ハッシュ強打」(と呼ばれる見つけることができます#使用していない国では-一般に「ポンド」として知られている£-または「ハッシュ」、および!「強打」など)。ウィキペディアには詳細があります。


9
「#!」の他の名前 「パウンドバン」と「ハッシュバン」が聞こえる場合があります。詳細については、en.wikipedia.org / wiki / Shebang_(Unix)を参照してください。
jlp

@jlpパウンドバング?それは「あなたの金のために強打」のようなものですか?ふ...-


1
技術的には、への引数はスクリプトへrmパス、つまりプロセスによって行われるexecve()システムコールへの最初の引数になります。あなたにスクリプトを実行した場合一般的に、./scriptnameなります、./scriptnameそして、あなたのようにそれを呼び出した場合scriptname、それがされる/path/to/scriptname場所/path/toのエントリである$PATHこと、スクリプトが発見された場所が。一般的に、それだけでされますscriptname、あなたは空の文字列を持っている場合$PATHとして、あなたはスクリプトを呼び出してきたscriptnameし、scriptname現在のディレクトリにあります。
ステファンシャゼル16年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.