O comando Echo com o operador AND não sai

4
echo hai && echo bye

imprime

hai 
bye

enquanto

echo hai && echo $?

imprime

hai
0

Quando o valor de retorno do primeiro comando de eco é 0 , como a instrução echo após o operador AND é executado? Não é rápido AND sair depois de ver o valor de retorno 0 ?

    
por Madhavan Kumar 19.04.2015 / 17:33

3 respostas

4

Aqui, também usando zsh , tenho

echo hai && echo bye
hai
bye

E da mesma forma

echo hai && echo %?
hai
0

Tem certeza de que está vendo hai e bye na mesma linha com exatamente os comandos que você forneceu aqui?

Em resposta direta à sua pergunta, um status de saída igual a zero é sucesso , então a segunda instrução é executada. (Isso permite que diferentes valores de status de saída diferentes de zero indiquem diferentes erros.)

    
por 19.04.2015 / 17:39
23

Sua confusão decorre do fato de que muitas linguagens populares (especialmente baseadas em C) param de avaliar && seqüências quando 0 é encontrado, porque 0 é considerado false e todo o resto é true . No Bash, no entanto, esse não é o caso. Por convenção, em sistemas POSIX (e todos os outros sistemas semelhantes a Unix), o código de retorno 0 é considerado SUCCESS (não houve erro, então nada é retornado) e um código de retorno diferente de zero é considerado FAILURE . Todo comando no Bash, seja um programa externo como um programa C ou um shell embutido, deve retornar um valor:

A simple command is a sequence of optional variable assignments followed by blank-separated words and redirections, and terminated by a control operator. The first word specifies the command to be executed, and is passed as argument zero. The remaining words are passed as arguments to the invoked command.

The return value of a simple command is its exit status, or 128+n if the command is terminated by signal n.

(...)

Shell builtin commands return a status of 0 (true) if successful, and non-zero (false) if an error occurs while they execute. All builtins return an exit status of 2 to indicate incorrect usage.

Um valor de retorno não é um booleano, no entanto. É um número entre 0 e 255:

The exit status of an executed command is the value returned by the waitpid system call or equivalent function. Exit statuses fall between 0 and 255, though, as explained below, the shell may use values above 125 specially. Exit statuses from shell builtins and compound commands are also limited to this range. Under certain circumstances, the shell will use special values to indicate specific failure modes.

For the shell's purposes, a command which exits with a zero exit status has succeeded. An exit status of zero indicates success. A non-zero exit status indicates failure. When a command terminates on a fatal signal N, bash uses the value of 128+N as the exit status.

(negrito meu.)

Quando um comando reporta seu código de retorno de volta ao shell, geralmente é suficiente verificar se o código de saída é 0 ou não.

Agora, o próximo comando em uma lista colada com && será executado somente se o comando anterior retornou 0 - ou seja, SUCCESS :

AND and OR lists are sequences of one or more pipelines separated by the && and || control operators, respectively. AND and OR lists are executed with left associativity. An AND list has the form

              command1 && command2

command2 is executed if, and only if, command1 returns an exit status of zero.

    
por 19.04.2015 / 19:19
8

O valor de retorno dos comandos é diferente dos valores boolan típicos. 0 é sucesso ao executar um comando, qualquer outra coisa é falha. & & espera 0 para mim sucesso aqui por esse motivo.

    
por 19.04.2015 / 17:37

Tags