¿Cómo acceder al último valor de retorno en bash?

69

Escenario simple: estoy buscando un wsdlarchivo perdido en medio de un proyecto.

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

Ahora que sé dónde está, quiero hacer algo con este archivo, por ejemplo, editarlo. En lugar de copiar / pegar la ruta detrás de mi comando, ¿es posible usar la ruta devuelta findanteriormente? Al igual que es posible acceder al último argumento con el que ha escrito !$o con el último comando !!.
He leído que era posible con $?, pero solo me devuelve un error:0: command not found

$ echo $?
0: command not found
Anto
fuente
3
Este no es el valor de retorno, ¡es la salida!
MirandaVeracruzDeLaHoyaCardina
Para elaborar, el "valor de retorno" es siempre un número. Usualmente 0 significa éxito, y no cero significa algún tipo de falla. La cadena (o texto) que escupe el comando se denomina "salida", no su "valor de retorno".
Michael Dorst

Respuestas:

33

Ejecute el comando en la sustitución del comando:

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

El resultado ahora se almacena en la outputvariable que puede usar tantas veces como desee.

choroba
fuente
11
Esta no es una respuesta correcta. PS es.
mcmlxxxiii
@mcmlxxxiii: $?no contiene las rutas.
choroba
1
Mis disculpas, estaba confundido por el mal uso del término returnen la pregunta. Su respuesta es absolutamente correcta para la pregunta anterior.
mcmlxxxiii
44
$?contiene el estado de salida del último comando
Brett Wagner
Esta fue la respuesta que yo estaba buscando. Estoy interesado en la salida del comando anterior, no en el valor de retorno de éxito / error. ¡Así que gracias!
Joshua Pinter
74

No hay una variable bash especial para eso.

$? contiene el código de salida del último comando (0 = éxito,> 0 = código de error)

Puede usar la salida de findcon la -execbandera, así:

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

El {}se reemplaza con el nombre de archivo encontrado por find. Esto ejecutaría el comando para cada archivo encontrado. Si desea ejecutar un comando con todos los archivos encontrados como argumentos, use un +extremo como este:

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

Esto abriría una instancia de emacs con todos los archivos .wsdl encontrados abiertos en ella.

Una solución más general es almacenar la salida en una variable:

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

Esto funciona con todos los comandos, no solo con find. Aunque también podrías usar xargs:

  find -name '*.wsdl' | xargs emacs {}
ahilsend
fuente
¿Es posible $?devolver el código de salida de otro comando? por ejemplo, ping 1.1.1.1 -w 10; volver $?
girando el
1
$?contiene el código de salida del comando anterior, sea lo que sea. Entonces, la respuesta es sí.
ahilsend
43

Aquí hay un truco rápido que debería hacer lo que quieras con un mínimo de pulsaciones de teclas, si no te importa que el último comando se ejecute dos veces.

Use la tecla de retroceso, ala:

`!!`

p.ej

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

* editar: veo que la pregunta "posiblemente engañada" vinculada anteriormente también contiene esta respuesta. sigue siendo relevante directamente para este, así que lo dejo, pero lo siento por el engaño.

Robar
fuente
2
Muy inteligente. Creo que esta debería ser la respuesta aceptada, ya que resuelve el caso más común de no saber que necesita la salida hasta que ya haya ejecutado el comando.
Paul Ruane
1
Estoy de acuerdo, esto es lo que vine a buscar aquí. Hacer cualquier cosa en la línea anterior anula mi propósito, decidir retroactivamente que quiero hacer algo con el último valor devuelto. (Verifique una sucursal que encontré git br | grepen mi caso)
Jack Casey
Uno de mis favoritos, este es! Creo que hago esto día a día.
MetalGodwin
Creo que es muy inteligente que puedas hacer eso, pero no estoy seguro de lo útil que realmente es. ¿Escribir !!es mucho más fácil que presionar la tecla arriba? Y entonces aún puedes ver tu comando. Si ejecutar el comando de nuevo es aceptable, creo que presionar hacia arriba es igual de fácil (y un poco más comprensible y transparente),
Svend Hesselholt Henne Hansen