Diferença entre 'exit;' e 'sair $ ?;'

1

Existe alguma diferença entre esses dois comandos:

   exec "$(dirname "$0")/suman-shell";
   exit $?;

e

   exec "$(dirname "$0")/suman-shell";
   exit;

é o $? redundante no primeiro caso?

    
por Alexander Mills 08.11.2017 / 17:27

3 respostas

3

Existem várias falhas no seu script:

exec "$(dirname "$0")/suman-shell";
exit $?;
  • O primeiro é o ponto e vírgula final que é redundante. Eles são inofensivos, mas não servem para nada. Um fim de linha já é um separador, os ponto-e-vírgulas são usados como um separador entre vários comandos em uma única linha. A presença deles aqui está um pouco piorando a legibilidade do código.

  • O segundo é exit , por padrão, retorna o status de saída do comando anterior, portanto, declarar $? é redundante, embora esteja sinalizando a intenção.

  • O terceiro é exec nunca retorna em circunstâncias normais 1 , então a chamada exit não é alcançada em primeiro lugar e também é redundante.

1 Os únicos casos em que exec retorna é um argumento vazio, um redirecionamento quebrado ou o conjunto de opções execfail bash (que não é a configuração padrão). O primeiro e o segundo não se aplicam aqui, e não há provas que o terceiro faça.

    
por 08.11.2017 / 21:31
4

De help exit :

Exits the shell with a status of N. If N is omitted, the exit status is that of the last command executed.

Então, sim, é completamente redundante.

    
por 08.11.2017 / 17:30
2

Estritamente falando, há uma diferença entre exit e exit $? quando $IFS contém dígitos quando você esquece de citar $? e, portanto, está invocando a divisão + operador glob :

$ bash -c 'IFS=123; false; exit $?'; echo "$?"
bash: line 0: exit: : numeric argument required
2
$ bash -c 'IFS=123; false; exit'; echo "$?"
1
$ bash -c 'IFS=123; false; exit "$?"'; echo "$?"
1
$ bash -c "exit ''"
bash: line 0: exit: : numeric argument required

No primeiro caso, como $? não é citada, ela está sujeita à divisão de palavras. Com $IFS contendo 1 , o conteúdo de $? ( 1 ) é dividido em um argumento vazio em bash , então é como se você tivesse chamado exit '' .

    
por 08.11.2017 / 22:41