Lütfen kabuğun davranışını açıklayın (csh olması gerekiyordu)


0

Linux kutumda echo $SHELLsonuçlanır /bin/csh. Bu yüzden varsayılan kabuğumun c-shell olduğunu varsayıyorum. Bir kabuk betiğinin davranışını anlamaya çalışıyorum.
senaryo 1 - betiği içerir -

echo $1 $2 $3
echo $*
echo $argv[1] $argv[2]
$argv[3]
echo $argv[*]
echo $#argv

çıktı -

arg1 arg2 arg3
arg1 arg2 arg3 arg4
[1] [2]
./test.sh: line 4: [3]: command not found
[*]
4argv
  • Bu nedenle açıkça c-shell, csh tarafından çalıştırılması gereken koddaki son 4 satırı çalıştıramaz.

Ancak - #!/bin/cshbetiğin en üstüne shebang satırı eklediğimde, tüm çıktıları doğru yazdırıyor.

Soru - csh neden ilk senaryoda son 4 satırı doğru şekilde uygulamıyor ve neden açıkça shebang hattını eklemek zorundayım?

Yanıtlar:


1

Dosya başladığında #!/bin/csh, açıkça çekirdeğe komut dosyasını bu programla çalıştırmasını söyleyin. Ancak #!, dosyanızın başında hiçbir işlem yoksa , yürütme başarısız olur - exec () syscall başarısız olur - ve kabuğunuz dosyayı daha eski bir yöntem kullanarak doğrudan dosyayı geçirerek komut dosyasını çalıştırmayı dener /bin/sh.

Bourne kabuğu, shbu davranışı #!ortaya çıkmadan önce uyguladı ve bu şekilde yazılan komut dosyalarının shen azından uyumlu bir kabuğun altında çalışmasını bekliyor . csh uyumlu olmaktan uzaktır , bu nedenle bu betikleri sh altında çalıştırır . $ SHELL'iniz alakasız.

tcsh :

Pek çok sistem, standart 6 ya da sürüm 7 kabuklarını, kabuk komut dosyaları bu kabukla uyumlu olmadığından kullandığından, kabuk, ilk karakteri '#' olmayan bir betiği çalıştırmak için böyle bir 'standart' kabuk kullanır; Bu bir yorum ile başlamaz.

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.