Qual é o comando real executado ao executar um script com um shebang como seu nome com os mesmos argumentos?

0

Do bash manual sobre shebang

Most versions of Unix make this a part of the operating system’s command execution mechanism. If the first line of a script begins with the two characters‘ #!’, the remainder of the line specifies an interpreter for the program. Thus, you can specify Bash, awk, Perl, or some other interpreter and write the rest of the script file in that language.

The arguments to the interpreter consist of a single optional argument following the interpreter name on the first line of the script file, followed by the name of the script file, followed by the rest of the arguments. Bash will perform this action on operating systems that do not handle it themselves. Note that some older versions of Unix limit the interpreter name and argument to a maximum of 32 characters.

Será que "um argumento opcional" significa um argumento para uma opção, ou um argumento que pode estar lá ou não?

Por que "um único argumento opcional"? não permite múltiplos "argumentos opcionais"?

Se um script se parece com

#! /path/to/interpreter --opt1 opt1-arg --opt2 opt2-arg --opt3 nonopt-arg1 nonopt-arg2

...

quando executo o script no bash como

$ myscript arg1 arg2 arg3

qual é o comando real que está sendo executado no bash? É

$ /path/to/interpreter --opt1 opt1-arg --opt2 opt2-arg --opt3 nonopt-arg1 nonopt-arg2 myscript arg1 arg2 arg3

Obrigado.

    
por Tim 20.08.2017 / 18:45

2 respostas

5

Os argumentos para o interpretador neste caso são os argumentos construídos após a interpretação da linha shebang, combinando a linha shebang com o nome do script e seus argumentos de linha de comando.

Assim, um script AWK começando com

#! /usr/bin/awk -f

chamado myscript e chamado como

./myscript file1 file2

resulta nos argumentos reais

/usr/bin/awk -f ./myscript file1 file2

O único argumento opcional é -f neste caso. Nem todos os intérpretes precisam de um (veja /bin/sh , por exemplo), e muitos sistemas só permitem no máximo um (para que sua linha de shebang não funcione como você espera). O argumento pode conter espaços embora; todo o conteúdo da linha shebang depois que o intérprete é passado como um único argumento.

Para experimentar linhas shebang, você pode usar #! /bin/echo (embora isso não ajuda a distinguir argumentos quando há espaços envolvidos).

Veja Como os programas são executados para uma explicação mais detalhada de como as linhas shebang são processadas (no Linux).

    
por 20.08.2017 / 19:03
3

Leia a sua página execve(2) man. A limitação em um único argumento opcional depende do sistema operacional. Linux trata todas as palavras após o interpretador como um único argumento

Se você quiser fazer isso:

#! /path/to/interpreter --opt1 opt1-arg --opt2 opt2-arg --opt3 nonopt-arg1 nonopt-arg2

Você deveria de fato fazer isso

#!/bin/sh
exec /path/to/interpreter --opt1 opt1-arg --opt2 opt2-arg --opt3 nonopt-arg1 nonopt-arg2 "$@"
# ...................................................................................... ^^^^
    
por 20.08.2017 / 19:15