Vraag Hoe toegang krijgen tot de laatste geretourneerde waarde in bash?


Eenvoudig scenario: ik zoek een wsdl bestand verloren in het midden van een project.

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

Nu dat ik weet waar het is, wil ik iets doen met dit bestand, zeg het bewerken. In plaats van het pad achter mijn opdracht te kopiëren / plakken, is het mogelijk om het pad te gebruiken dat is geretourneerd find eerder? Net zoals het mogelijk is om toegang te krijgen tot het laatste argument dat je hebt getypt !$ of je laatste commando met !!.
Ik heb gelezen dat het mogelijk was met $?, maar het geeft me alleen een foutmelding: 0: command not found

$ echo $?
0: command not found

53
2017-07-25 13:46


oorsprong


mogelijk gedupliceerd Uitvoer van laatste shell-opdracht - Braiam
Klinkt als, ok bedankt. - Anto
Dit is niet de retourwaarde, het is de uitvoer! - MirandaVeracruzDeLaHoyaCardina


antwoorden:


Voer het commando uit in de opdrachtvervanging:

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

De uitvoer is nu opgeslagen in de output variabele die u zo vaak kunt gebruiken als u wilt.


29
2017-07-25 13:57



Dit is geen goed antwoord. $? is. - mcmlxxxiii
@mcmlxxxiii: $? bevat niet de paden. - choroba
Mijn excuses, ik was in de war door het misbruik van de term return in de vraag. Uw antwoord is absoluut correct voor de bovenstaande vraag. - mcmlxxxiii
$? bevat de exitstatus van de laatste opdracht - Brett Wagner


Er is daarvoor geen speciale bash-variabele.

$? bevat de afsluitcode van de laatste opdracht (0 = succes,> 0 = foutcode)

U kunt de uitvoer van gebruiken find met de -exec vlag, zoals deze:

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

De {} wordt vervangen door de bestandsnaam gevonden door find. Dit zou het commando uitvoeren voor elk gevonden bestand. Als je een commando wilt uitvoeren met alle gevonden bestanden, gebruik dan a + aan het einde zo:

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

Dit zou één emacs-instantie openen met alle gevonden .wsdl-bestanden erin geopend.

Een meer algemene oplossing is om de uitvoer op te slaan in een variabele:

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

Dit werkt met alle opdrachten, niet alleen vinden. Hoewel je ook zou kunnen gebruiken xargs:

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

59
2017-07-25 14:12





Hier is een snelle hack die moet doen wat je wilt met minimale toetsaanslagen, als je het niet erg vind dat de laatste opdracht twee keer wordt uitgevoerd.

Gebruik backtick, ala:

`!!`

bijv.

$ vind. -name HardToFind.txt
some / gekke / pad / naar / HardToFind.txt
$ vim `!!`

* bewerking: ik zie dat de bovenstaande "mogelijk gedupeerde" vraag ook dit antwoord bevat. nog steeds direct relevant voor deze, dus het achterlaten, maar sorry voor de dupe.


33
2017-09-12 04:50



Heel erg slim. Ik denk dat dit het geaccepteerde antwoord zou moeten zijn, omdat het het meest voorkomende geval van niet weten dat je de uitvoer nodig hebt, oplost totdat je het commando al hebt uitgevoerd. - Paul Ruane
Ik ben het ermee eens, dit is waar ik hier naar op zoek was. Iets doen op de vorige regel verslaat mijn doel, om met terugwerkende kracht te beslissen dat ik iets wil doen met de laatst geretourneerde waarde. (Zoek een filiaal af dat ik heb gevonden via git br | grep in mijn geval) - Jack Casey
Een van mijn favorieten, dit is! Denk dat ik dit elke dag doe. - MetalGodwin
Ik denk dat dit heel slim is, dat je dat kunt doen, maar niet weet hoe nuttig het werkelijk is. Is aan het typen !! is dat veel gemakkelijker dan op de op-toets drukken? En dan kun je nog steeds je opdracht zien. Als het opnieuw uitvoeren van de opdracht acceptabel is, denk ik dat alleen opdrukken net zo gemakkelijk is (en een beetje meer begrijpelijk en transparant), - Svend Hesselholt Henne Hansen