Como acessar o último valor de retorno no bash?


69

Cenário simples: estou procurando um wsdlarquivo perdido no meio de um projeto.

$ find -name '*.wsdl'
./some/very/very/long/way/to/some/lost/directory/filename.wsdl

Agora que sei onde está, quero fazer algo com este arquivo, digamos editá-lo. Em vez de copiar / colar o caminho atrás do meu comando, é possível usar o caminho retornado findanteriormente? Assim como é possível acessar o último argumento digitado !$ou o último comando com !!.
Eu li que era possível com $?, mas isso só me retorna um erro:0: command not found

$ echo $?
0: command not found

3
Este não é o valor de retorno, é a saída!
MirandaVeracruzDeLaHoyaCardina

Para elaborar, o "valor de retorno" é sempre um número. Geralmente 0 significa sucesso e diferente de zero significa algum tipo de falha. A sequência (ou texto) que o comando cospe é chamada de "saída", não de "valor de retorno".
Michael Dorst

Respostas:


33

Execute o comando na substituição de comando:

output=$( find -name '*.wsdl' )
echo "$output"

A saída está agora armazenada na outputvariável que você pode usar quantas vezes quiser.


11
Esta não é uma resposta correta. $? é.
Mcmlxxxiii 11/08/16

@mcmlxxxiii: $?não contém os caminhos.
choroba

11
Minhas desculpas, fiquei confuso com o uso indevido do termo returnna pergunta. Sua resposta está absolutamente correta para a pergunta acima.
Mcmlxxxiii

4
$?contém o status de saída do último comando
Brett Wagner

Esta foi a resposta que eu estava procurando. Estou interessado na saída do comando anterior, não no valor de retorno de sucesso / falha. Então obrigado!
Joshua Pinter

74

Não há variável bash especial para isso.

$? contém o código de saída do último comando (0 = sucesso,> 0 = código de erro)

Você pode usar a saída de findcom o -execsinalizador, assim:

 find -name  '*.wsdl' -exec emacs {} \;

O {}é substituído pelo nome do arquivo encontrado por find. Isso executaria o comando para cada arquivo encontrado. Se você deseja executar um comando com todos os arquivos encontrados como argumentos, use um +no final como este:

  find -name '*.wsdl' -exec emacs {} +

Isso abriria uma instância do emacs com todos os arquivos .wsdl encontrados abertos nela.

Uma solução mais geral é armazenar a saída em uma variável:

result=$(find -name '*.wsdl')
emacs $result

Isso funciona com todos os comandos, não apenas com a localização. Embora você também possa usar xargs:

  find -name '*.wsdl' | xargs emacs {}

É possível $?retornar o código de saída de outro comando? por exemplo, ping 1.1.1.1 -w 10; retornar $?
twnaing 19/03

11
$?contém o código de saída do comando anterior, seja o que for. Então a resposta é sim.
ahilsend 21/03

43

Aqui está um truque rápido que deve fazer o que você deseja com o mínimo de pressionamentos de tecla, se você não se importa que o último comando seja executado duas vezes.

Use backtick, ala:

`!!`

por exemplo

$ find. -name HardToFind.txt
some / crazy / path / to / HardToFind.txt
$ vim `!!`

* editar: vejo que a pergunta "possivelmente enganada" acima também contém essa resposta. ainda é relevante diretamente para este, deixando-o, mas desculpe-me pelo engano.


2
Muito esperto. Eu acho que essa deve ser a resposta aceita, pois resolve o caso mais comum de não saber que você precisa da saída até que você já execute o comando.
Paul Ruane

11
Eu concordo, é isso que eu vim aqui procurando. Fazer qualquer coisa na linha anterior derrota meu objetivo, decidir retroativamente que quero fazer algo com o último valor retornado. (Verificação geral um ramo que eu encontrei via git br | grepno meu caso)
Jack Casey

Um dos meus favoritos, este é! Acho que faço isso no dia-a-dia.
MetalGodwin

Eu acho que é muito inteligente que você possa fazer isso, mas não tenho certeza de quão útil é realmente. Digitar !!é muito mais fácil do que pressionar a tecla para cima? E então você ainda pode ver seu comando. Se executar o comando novamente é aceitável, acho que apenas pressionando-se é tão fácil (e um pouco mais compreensível e transparente),
Svend Hesselholt Henne Hansen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.