2011-10-20 21 views
13

文を見つけた後でもbashスクリプトを実行して自分自身を削除できますか?私はconains test.shスクリプト実行などのために :自己削除bashスクリプト

<--some commands--> 
rm test.sh 
<--some more commands--> 

end 

スクリプト自体

+3

アプリケーションが実行されると、そのコードがメモリにロードされます。ディスク上のファイルを削除するだけで、メモリ内のコードには影響しません。 –

+1

おそらくスクリプト全体が実行時にメモリに読み込まれるため、 'rm test.sh'の後のコマンドは実行されるメモリにまだ存在しています。 – MrMisterMan

+0

メモリにコピーを作成しません。たとえば、スクリプトが実行中に変更された場合、スクリプトは変更を実行します。これは最近私に頭痛を与えています。かわいい例:この1行のスクリプトはあなたのディスクを短い順序で埋めます: 'cat $ 0 >> $ 0'。 – Ned

答えて

24

:-)あなたの期待につきです。

従ってrmは、libc関数を "unlink()"と呼びます。この関数は、inodeの "inode"数字はls -i)。

inodeは、プログラムが開いている限り存在します。

次のように、簡単にこの主張をテストすることができます:あなたは、もはやLSでそれを見ることができるにもかかわらず、ファイルがまだ開かれていない

$ pgrep -lf bash\ ni 
31662 bash ni 
$ lsof -p 31662|grep ni 
bash 31662 wmertens 255r REG 14,2   7 12074052 /Users/wmertens/ni 
$ rm ni 
$ lsof -p 31662|grep ni 
bash 31662 wmertens 255r REG 14,2   7 12074052 /Users/wmertens/ni 

:別のウィンドウにいる間

$ echo read a> ni 
$ bash ni 

。 これは、ファイル全体を読み取ったbashではありません.bashが完了するまで、実際には行っていません。

+1

これは、更新プログラムが既存の実行可能ファイルを決して変更するのではなく、リンクを解除して新しいバージョンを書き直す理由です。 – curiousguy

+0

でも、ファイルが別のプロセスによって上書きされるとどうなりますか?ファイルはリンクされていないので、「空き領域」とみなされますか? –

+0

@G_G上書きは、ファイル名で指定されたディレクトリエントリが別のinodeにリンクすることを意味します。元のinodeがbashによって閉じられていない限り、それは存在し、bashによって使用されます。 – w00t

-1

事実を削除する前に、最後まで実行し、この現象は、読み(bashのような)シェル、固有のものですファイルをメモリに格納して実行します。

次a.batを実行すると:>エコーYO1:

C a.bat>: C: あなたは次のような出力を得る

YO1 デルa.bat エコーYO 2をエコー Yo1

C:> del a.bat バッチファイルが見つかりません。

これは、実際に何が起こることはbashが開いているファイルを保持し、rmは、その停止をすることはありませんということです

+1

これは誤りです。 w00tの答えは正しいです。私は個人的に、bashスクリプトが実行中に*編集されたときにエラーが発生したことを見てきました。これは、そのファイルが開いて読み込まれていることを示しています。 –

関連する問題