Como acessar o último valor de retorno no bash?

53

Cenário simples: estou procurando por um arquivo wsdl perdido no meio de um projeto.

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

Agora que eu sei onde está, quero fazer algo com esse arquivo, por exemplo, edite-o. Em vez de copiar / colar o caminho por trás do meu comando, é possível usar o caminho retornado por find anterior? Assim como é possível acessar o último argumento que você digitou com !$ ou seu último comando com !! .
Eu li que era possível com $? , mas só me retorna um erro: 0: command not found

$ echo $?
0: command not found
    
por Anto 25.07.2013 / 15:46

3 respostas

29

Execute o comando na substituição do comando:

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

A saída agora é armazenada na variável output , que você pode usar quantas vezes quiser.

    
por choroba 25.07.2013 / 15:57
61

Não há uma variável 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 find com o sinalizador -exec , desta forma:

 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ê quiser 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 nela abertos.

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 o find. Embora você também possa usar xargs :

  find -name '*.wsdl' | xargs emacs {}
    
por ahilsend 25.07.2013 / 16:12
34

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

Use o backtick, ala:

'!!'

por exemplo,

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

* edit: Eu vejo que a pergunta "possivelmente enganada" acima também contém esta resposta. ainda relevante diretamente para este, então deixando-o, mas desculpe pelo dupe.

    
por Rob 12.09.2014 / 06:50

Tags