Por favor, explique o comportamento do shell (supostamente csh)

0

Na minha caixa Linux, echo $SHELL resulta em /bin/csh . Então eu suponho que meu shell padrão é c-shell. Eu estou tentando entender o comportamento de um script de shell.
cenário 1 - o script contém -

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

saída -

arg1 arg2 arg3
arg1 arg2 arg3 arg4
[1] [2]
./test.sh: line 4: [3]: command not found
[*]
4argv
  • Então, claramente, o c-shell não é capaz de executar as últimas 4 linhas no script que devem ser executadas por csh.

No entanto - quando eu adiciono a linha shebang #!/bin/csh na parte superior do script, ela imprime todas as saídas corretamente.

Pergunta - Por que o csh não está executando as últimas 4 linhas corretamente no primeiro cenário e por que explicitamente devo incluir a linha shebang?

    
por Sumod 13.09.2011 / 17:18

1 resposta

1

Quando o arquivo começa com #!/bin/csh , você diz explicitamente ao kernel para executar o script com esse programa. Mas se não houver #! no início de seu arquivo, a execução falhará - o exec () syscall falhará - e seu shell tentará executar o script usando um método ainda mais antigo, passando o arquivo diretamente para /bin/sh .

O shell Bourne, sh , implementou esse comportamento antes que #! aparecesse, e assim os scripts escritos dessa maneira esperam ser executados em sh ou pelo menos um shell compatível. csh é longe de compatível, então ele roda tais scripts em sh . Seu $ SHELL é irrelevante.

tcsh :

Because many systems use either the standard version 6 or ver- sion 7 shells whose shell scripts are not compatible with this shell, the shell uses such a 'standard' shell to execute a script whose first character is not a '#', i.e., that does not start with a comment.

    
por 13.09.2011 / 17:28

Tags