İlgili: Hangi kabuk yorumlayıcısı hiç kodsuz bir senaryo çalıştırır?
Betiğin, #!
bir çift çizgi olmadığı için bir shebang / hashbang / satırı yoktur #!
.
Ancak, komut dosyası bir kabuk tarafından yürütülür (yukarıdaki bağlantılı soru ve yanıtlara bakın) ve bu kabukta, -
işlev adında geçerli bir karakter varsa , satır --
, hiçbir şey yapmayan (iyi çalışır :
, hiçbir şey yapmaz ) ve asla çağrılmaz.
İşlev, daha yaygın çok satırlı gösterimde (sadece neye benzediğini daha açık hale getirmek için, garip adı aslında bir işlev olduğu gerçeğini gizler):
-- () {
:
}
İşlev tanımının tek amacı, kabuk betiğinde geçerli olan bir satıra ve aynı zamanda geçerli bir SQL komutuna (yorum) sahip olmaktır. Bu tür kodlara çokglot denir .
Sahte kabuk işlevini bildirdikten sonra, komut dosyası, bir kabuk komut dosyası yorumlayıcısı tarafından yürütüldüğünde exec
, geçerli kabuğu , komut satırından komut dosyasının yol adında db2 -txf "$0"
kullanılanla aynı olacak şekilde çalışan işlemden değiştirmek için kullanır db2 -txf
.
Bu hile muhtemelen Bourne kabuğunun dash
veya diğer ash
temelli kabukların, yash
Bourne kabuğunun ksh88
veya bu kabuğun adı tire işareti olan işlevleri kabul etmediği gibi ksh93
kullanıldığı sistemlerde güvenilir bir şekilde çalışmaz /bin/sh
.
Ayrıca:
Aşağıdakilerin de işe yaradığını varsayalım (gerçekten test edilmedi):
--() { exec db2 -txf "$0"; }; --