Aşağıdaki komut dosyası neden kendini siliyor?


84

Aşağıdaki içeriğe sahip bir çalıştırılabilir dosya oluşturup çalıştırırsanız, kendisini siler.
Bu nasıl çalışıyor?

#!/bin/rm


@ DigitalTrauma Heh, bunu gördüğümde ilk düşüncem buydu.
kedi,

önemli değil rm, mesele #!. Soru, herhangi bir çalıştırılabilir betiğin bir #!esere göre nasıl yapıldığına dair yeniden ifade edilebilir .
njzk2

1
Bunun üzerine yanılmayı nasıl başardınız?
user1717828

1
Bu kesinlikle epik bir soru. Sadece bir kez oy kullanabildiğim için üzgünüm.
Danila Kiver

Yanıtlar:


112

Çekirdek benden başlayarak satırı yorumlar #!ve betiğin ismini kullanarak betiği çalıştırmak için kullanır; yani bu bitiyor

/bin/rm scriptname

betiği siler. As ( Stéphane Chazelas işaret , scriptnameaksi hangi yolu bulundu, yani olduğu gibi içinde geçirilen, akrabası veya mutlak bir yol belirtilmişse - burada senaryoyu bulmak için yeterlidir PATHeğer senin muhtemelen emptry dizesi dahil önüne edilir PATHolduğunu içerir ve komut dosyası geçerli dizinde. Bir eko komut dosyasıyla oynayabilirsiniz - #!/bin/echo- bunun nasıl çalıştığını görmek için.)

Gibi Hobbs işaret, bu senaryonuz aslında bir demektir rmkomut değil, bir bashikincisi ile başlayacak - Senaryo #!/bin/bash.

Bunun Linux'ta nasıl çalıştığı hakkında ayrıntılar için programların nasıl çalıştırıldığını görün ; Bu yazıdaki yorumlar diğer platformlar için detaylar veriyor. #!bir shebang olarak adlandırılır, bu terimi arayarak birçok bilgi bulabilirsiniz ( öneri için Aaron'a teşekkürler ). Gibi jlp işaret, ayrıca o "kiloluk patlama" ya da "hash patlama" (olarak anılacaktır bulacaksınız #kullanmayan ülkelerde - genellikle "sterlin" olarak bilinir £- veya "karma" ve !"patlama" olarak ). Wikipedia daha fazla bilgiye sahip.


9
"#!" İçin diğer isimler "Pound bang" ve "karma bang" duyabiliyorsunuz. Ayrıntılar için en.wikipedia.org/wiki/Shebang_(Unix) adresine bakın.
jlp

@jlp Pound bang? Bu "paranın karşılığını bang" gibi mi? Heh ...
kedi

Bana ol ' CrunchBang
Xen2050

1
Teknik olarak, argüman komut dosyasının yolurm olacaktır , bu işlem tarafından yapılan execve () sistem çağrısının ilk argümanıdır. Siz senaryoyu ran Genellikle, olacak, ve siz bunu çağrılan eğer , o olacak nereye içinde giriştir bu komut bulunduğu yerden. Genellikle, sadece tarafından edecektir sen boş bir dize varsa ve gibi senaryoyu çağrılan ettik ve geçerli dizinde olduğunu. ./scriptname./scriptnamescriptname/path/to/scriptname/path/to$PATHscriptname$PATHscriptnamescriptname
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.