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
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
:-) 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.
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
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? –
@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
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
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. –
Bir uygulama yürütüldüğünde, kodu belleğe yüklenir. Diskteki kodu etkilemeyen, sadece diskteki dosyayı sildiniz. –
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
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