Por que 'bash -c' echo $ 0 '' output “bash”?

3
$ bash -c 'echo $0 ' foo 
foo

$ bash -c 'echo $0 '  
bash

Do manual do bash

($0) Expands to the name of the shell or shell script. This is set at shell initialization.

If Bash is invoked with a file of commands (see Section 3.8 [Shell Scripts], page 39), $0 is set to the name of that file.

If Bash is started with the -c option (see Section 6.1 [Invoking Bash], page 80), then $0 is set to the first argument after the string to be executed, if one is present.

Otherwise, it is set to the filename used to invoke Bash, as given by argument zero.

O que "de outra forma" significa?

Que casos inclui?

Inclui o caso quando o bash é iniciado com -c sem qualquer "argumento após a sequência a ser executada"?

Eu esperava que bash -c 'echo $0 ' não emitisse nada, de acordo com o segundo caso da cotação, mas gera bash .

Obrigado.

    
por Tim 28.06.2016 / 14:38

3 respostas

7

A documentação que você cita dá três casos:

If bash is invoked with a file of commands, $0 is set to the name of that file.

(caso 1)

If bash is started with the -c option, then $0 is set to the first argument after the string to be executed, if one is present.

(caso 2; observe os dois "if" s, que devem ambos ser satisfeitos neste caso)

Otherwise, it is set to the filename used to invoke bash, as given by argument zero.

(caso 3).

A cláusula "caso contrário" abrange qualquer situação que não esteja coberta pelos casos 1 e 2: bash não é chamado com um arquivo de comandos e bash não é iniciado com a opção -c , ou é iniciado com a opção -c , mas sem nenhum argumento após a sequência ser executada.

Portanto, sim, inclui o caso em que o Bash é iniciado com -c sem nenhum argumento após a sequência a ser executada. Ele também inclui o caso básico echo $0 quando executado a partir de um shell interativo, já que o shell interativo foi provavelmente iniciado sem um arquivo de comandos ou uma opção -c .

    
por 28.06.2016 / 14:45
5

Você pode fazer um teste para entender melhor o manual; suponha que eu tenha Bash em /bin . Eu uso o caminho absoluto para chamar o bash com o sinalizador -c da seguinte forma:

/bin/bash -c 'echo $0'
A saída

será /bin/bash , pois usei /bin/bash como nome para invocar o Bash. Se eu usar apenas bash -c 'echo $0' ( /bin está em meu $PATH ), a saída será apenas bash , conforme esperado.

    
por 28.06.2016 / 14:54
1

O manual do bash não descreve o que acontece neste caso, até onde eu posso encontrar. O que acontece com bash -c COMMAND sem argumento para atribuir a $0 é que $0 está definido para o nome do arquivo usado para invocar bash, mesmo quando não há nem um script nem uma opção -c .

Este é o comportamento padrão, codificado por POSIX .

Para o significado de "caso contrário", consulte um dicionário em inglês.

    
por 29.06.2016 / 00:58

Tags