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
Anto
fonte
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.

choroba
fonte
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 {}
ahilsend
fonte
É 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.

Roubar
fonte
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