Come accedere all'ultimo valore di ritorno in bash?


69

Scenario semplice: sto cercando un wsdlfile perso nel mezzo di un progetto.

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

Ora che so dove si trova, voglio fare qualcosa con questo file, per esempio modificarlo. Invece di copiare / incollare il percorso dietro il mio comando, è possibile utilizzare il percorso restituito in findprecedenza? Proprio come è possibile accedere all'ultimo argomento con cui hai digitato !$o al tuo ultimo comando !!.
Ho letto che era possibile con $?, ma mi restituisce solo un errore:0: command not found

$ echo $?
0: command not found

3
Questo non è il valore restituito, è l'output!
MirandaVeracruzDeLaHoyaCardina,

Per elaborare, il "valore restituito" è sempre un numero. Di solito 0 significa successo e un valore diverso da zero indica un tipo di errore. La stringa (o testo) emessa dal comando viene definita come "output", non come "valore di ritorno".
Michael Dorst,

Risposte:


33

Esegui il comando nella sostituzione comando:

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

L'output è ora memorizzato nella outputvariabile che puoi usare tutte le volte che vuoi.


11
Questa non è una risposta corretta $? è.
mcmlxxxiii,

@mcmlxxxiii: $?non contiene i percorsi.
Choroba,

1
Mi scuso, sono stato confuso dall'uso improprio del termine returnnella domanda. La tua risposta è assolutamente corretta per la domanda sopra.
mcmlxxxiii,

4
$?contiene lo stato di uscita dell'ultimo comando
Brett Wagner,

Questa era la risposta che stavo cercando. Sono interessato all'output del comando precedente e non al valore di ritorno esito positivo / negativo. Quindi grazie!
Joshua Pinter,

74

Non esiste una variabile bash speciale per questo.

$? contiene il codice di uscita dell'ultimo comando (0 = successo,> 0 = codice errore)

Puoi usare l'output di findcon il -execflag, in questo modo:

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

Il {}viene sostituito con il nome del file trovato da find. Ciò eseguirà il comando per ogni file trovato. Se si desidera eseguire un comando con tutti i file trovati come argomenti, utilizzare un +fine come questo:

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

Ciò aprirà un'istanza di emacs con tutti i file .wsdl trovati aperti in essa.

Una soluzione più generale è archiviare l'output in una variabile:

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

Funziona con tutti i comandi, non solo per trovare. Anche se potresti anche usare xargs:

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

È possibile $?restituire il codice di uscita di un altro comando? ad es. ping 1.1.1.1 -w 10; restituire $?
twnaing

1
$?contiene il codice di uscita del comando precedente, qualunque esso sia. Quindi la risposta è sì.
ahilsend

43

Ecco un trucco rapido che dovrebbe fare quello che vuoi con sequenze di tasti minime, se non ti dispiace che l'ultimo comando venga eseguito due volte.

Usa backtick, ala:

`!!`

per esempio

$ find. -name HardToFind.txt
alcuni / folle / path / to / HardToFind.txt
$ vim `!!`

* modifica: vedo che la domanda "possibilmente duplicata" collegata sopra contiene anche questa risposta. ancora attinente direttamente a questo, quindi lasciandolo, ma scusate per il dupe.


2
Molto intelligente. Penso che questa dovrebbe essere la risposta accettata in quanto risolve il caso più comune di non sapere che hai bisogno dell'output fino a quando non hai già eseguito il comando.
Paul Ruane,

1
Sono d'accordo, questo è quello che sono venuto qui a cercare. Fare qualsiasi cosa nella riga precedente sconfigge il mio scopo, per decidere retroattivamente che voglio fare qualcosa con l'ultimo valore restituito. (Guarda un ramo che ho trovato git br | grepnel mio caso)
Jack Casey,

Uno dei miei preferiti, questo è! Penso che lo faccia ogni giorno.
MetalGodwin,

Penso che sia molto intelligente che tu possa farlo, ma non sono sicuro di quanto sia davvero utile. La digitazione !!è molto più semplice della pressione del tasto Su? E poi puoi ancora vedere il tuo comando. Se eseguire di nuovo il comando è accettabile, penso che semplicemente premere su sia altrettanto semplice (e un po 'più comprensibile e trasparente),
Svend Hesselholt Henne Hansen
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.