quebrando o loop de comando, mas o código de saída não é o motivo?

0

Eu corro o seguinte:

echo "while emacs;do echo $?;done;echo Exit code: $?;" | bash

Se eu sair do emacs através do menu ou do botão fechar, ele imprime o código de saída 0 e reinicia.

Se eu sair do emacs por meio de digitação (kill-emacs 1) ctrl-x ctrl-e

O Emacs é eliminado e o loop também é eliminado, mas o código de saída ainda é 0.

O que está causando a ruptura do loop?

ATUALIZAÇÃO: De acordo com o conselho da pqnet, usei aspas simples, o código agora diz:

echo 'while emacs;do echo Exit code: $?;done;echo "Exit code: $?";echo "Loop End."' | bash

Isso produz o mesmo resultado. Eu suponho que preciso salvar o valor do pid dentro do loop while. Então eu tento:

echo 'while epid=$(emacs);do echo Exit code: $epid;done;echo "Exit code: $epid";echo "Loop End."' | bash

Se esses resultados forem confiáveis, o código de saída em ambos os casos é uma string vazia (ou binário invisível), mas também não acho isso correto? Minha afirmação do 'valor de retorno' é um código de saída incorreto, ou apenas aquele epid não o captura?

ATUALIZAÇÃO: Uma das respostas explicou por que eu não estava obtendo os resultados esperados, mas agora estou curioso para saber que código permitiria que eu visualizasse o código de saída do emacs, já que nada do que eu criei faz isso.

    
por Rob F 03.07.2015 / 14:47

2 respostas

1

RTFM :

while

The syntax of the while command is:

while test-commands; do consequent-commands; done

Execute consequent-commands as long as test-commands has an exit status of zero. The return status is the exit status of the last command executed in consequent-commands, or zero if none was executed.

Se você deseja adquirir um valor de retorno de test-commands , precisará atribuí-lo a outra variável explicitamente:

#!/bin/bash

while
        emacs
        ret=$?
        ((ret == 0))
do
        echo "Exit code: $ret"
done
echo "Exit code: $ret"
echo "Loop End."
    
por 03.07.2015 / 19:18
0

Seu loop while é avaliado em um valor booleano. Nesse caso, você também pode lê-lo como while true ou while 0 . Então, se emacs retornar outro valor como 1 , se for cancelado, o loop terminará.

    
por 03.07.2015 / 15:48