Eski meslektaşım tarafından bash'da yazılmış bir proje üzerinde çalışırken, tüm .sh dosyalarının hiçbir şey içermediğini fark ettim ama fonksiyon tanımları #!/bin/false
ile başlıyor, yani anladığım kadarıyla, yalnızca dahil dosyaların yürütülmesini önleyen bir güvenlik mekanizması.Başhekimliğinde #!/Bin/false 'in amacı
Örnek:
#!/bin/false
function foo(){
echo foontastic
}
my_script.sh
#!/bin/bash
./my_foo.sh # does nothing
foo # error, no command named "foo"
. ./my_foo.sh
foo # prints "foontastic"
Ancak #!/bin/false
kullanmadığınızda
my_foo.sh, hem doğru ve yanlış kullanımının etkileri tam olarak aynı:
Örnek:
my_bar.sh
function bar(){
echo barvelous
}
my_script.sh
#!/bin/bash
./my_bar.sh # spawn a subshell, defines bar and exit, effectively doing nothing
bar # error, no command named "bar"
. ./my_bar.sh
bar # prints "barvelous"
yana düzgün beklenen işleri olarak her iki durumda da source
onlara ekleyerek bu komut dosyalarını kullanarak ve bunları yürütme Her iki durumda da bir ebeveyn kabuğunun perspektifinden hiçbir şey yapmaz ve geçersiz kullanımla ilgili bir hata mesajı üretmez, tam olarak bu betikteki #!/bash/false
'un amacı nedir? üst kabuğun açısından #!/bin/false
veya kullanarak
geçerli: 'FALSE shebang ile, içerik yürütülmez. Yanlış bağlamda kullanıldığında ya da ağır kaynaklandığında betiğin hataya açık olması güvenliktir. Muhtemelen, meslektaşınızın yakaladığı, çoğu durumda kod üzerinde hiçbir etkisi olmayan, ancak daha karmaşık durumlarda yararlı olabilecek bir alışkanlıktır. – Aserre
Aynı zamanda, kabuk yorumlayıcısını doğrudan 'bash my_script.sh' olarak çağırdığınızda, "#!/Bin/true" veya "#!/Bin/false" gibi kuyruk satırlarının betik üzerinde hiçbir etkisi olmadığı dikkate alınmalıdır. ', bu sözdizimi 'bash' ile ne olursa olsun betiği çalıştırır ve 'foontastic' foontastic ' – Inian
'/my_bar.sh' bir yankı ortaya çıkarmaz: yepyeni bir kabuk oluşturur. Bu sadece bir teknik değildir: alt kabuklar ana kabuktaki tüm değişkenlerin (dışa aktarma için işaretlenmemiş olanlar dahil) bir kopyasını alırken, ayrı bir kabuk yalnızca dışa aktarılan değişkenleri alır. Alt kümeler, örneğin, parantezler '()' ibaresiyle, '|', process/command substitution '$()' '<()' '>()' komutunu ekleyerek diğer şekillerde başlatılır. – Fred