2011-10-20 24 views
13

Bir bash betiği kendini silmek için bir deyim ile karşılaştıktan sonra nasıl yürütülür? I conains test.sh komut ran örneğin için :Kendi kendini silme bash betiği

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

end 

komut kendini

+3

Bir uygulama yürütüldüğünde, kodu belleğe yüklenir. Diskteki kodu etkilemeyen, sadece diskteki dosyayı sildiniz. –

+1

Muhtemelen tüm betik yürütme sırasında belleğe okunur ve böylece rm test.sh'den sonra komutlar çalıştırılacak bellekte hala var olur. – MrMisterMan

+0

Bellekte bir kopya oluşturmuyor. Yani, örneğin, komut dosyası çalıştırılırken değiştirilirse, değişiklikleri yürütür. Bu bana son zamanlarda bir baş ağrısı veriyor. Sevimli örnek: Bu tek satırlı betik diskinizi kısa sırayla dolduracaktır: 'cat $ 0 >> $ 0'. – Ned

cevap

24

:-) beklentiniz başınadır.

Yani rm İçinde dizinden inode'a "bağlantı" kaldıracaktır "bağlantısını kesmesine()" libc işlevini çağırır. Bu "bağlantı" bir inode numarası ile birlikte bir dosya adı aslında (siz düğüm görebilirsiniz ls -i ile numaralar).

Program, açık olduğu sürece inode var.

aşağıdaki gibi kolaylıkla bu iddiayı test edebilirsiniz: artık ls görebiliyorum rağmen dosya hala açılır

$ 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 

: başka bir pencerede ise

$ echo read a> ni 
$ bash ni 

. Yani tüm bu bash bütün dosyayı okuyor - bash onunla bitene kadar gerçekten gitmiyor.

+1

Bu nedenle, bir güncelleme programının mevcut yürütülebilir dosyaları hiçbir zaman değiştirmemesi, daha sonra bunların bağlantısını kaldırması, ardından yeni sürümü yeniden yazması gerekir. – curiousguy

+0

Tamam, ama dosya başka bir işlem tarafından üzerine yazılırsa ne olur? Dosya bağlantısız, dolayısıyla "boş alan" olarak sayılıyor, değil mi? –

+0

@G_G overwriting, dosya ismiyle adlandırılan dizin girişinin artık başka bir inode'a bağlandığı anlamına gelir. Orijinal inode, bash tarafından kapatılmadığı sürece, var olacak ve bash tarafından kullanılacak. – w00t

-1

Aslında silmeden önce sonuna kadar çalıştırır, bu olgu oku (Bash gibi) kabukları, özgüdür belleğe dosyalayın ve sonra bunları çalıştırın.

aşağıdaki a.bat yürütmek durumunda: C:>

C a.bat:> echo YO1 yankı Yo2 Aşağıdaki çıktıyı almak

a.bat YO1 del yankı Yo1

C:> del a.bat Toplu iş dosyası bulunamadı.

Bu gerçekte neler oluyor o bash açık dosyayı tutar ve rm o dur yapmaz ise

+1

Bu yanlıştır; w00t'un cevabı doğru. Bir bash betiği * düzenlenirken *, dosyanın açık ve okunmakta olduğunu belirten bir hata sonucu şahsen gördüm. –

İlgili konular