Jak uzyskać dostęp do ostatniej zwracanej wartości w bash?


69

Prosty scenariusz: szukam wsdlpliku zgubionego w trakcie projektu.

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

Teraz, gdy wiem, gdzie to jest, chcę coś zrobić z tym plikiem, powiedzmy edytuj. Czy zamiast skopiować / wkleić ścieżkę za moim poleceniem, można użyć ścieżki zwróconej findwcześniej? Tak jak jest to możliwe, aby uzyskać dostęp do ostatniego argumentu, który wpisałeś !$lub ostatniego polecenia !!.
Czytałem, że było to możliwe $?, ale zwraca mi tylko błąd:0: command not found

$ echo $?
0: command not found

3
To nie jest wartość zwracana, to wynik!
— MirandaVeracruzDeLaHoyaCardina

Aby to rozwinąć, „wartość zwracana” jest zawsze liczbą. Zwykle 0 oznacza sukces, a niezerowa oznacza pewien rodzaj awarii. Ciąg (lub tekst), który wypluwa polecenie, jest określany jako „wynik”, a nie „wartość zwracana”.
— Michael Dorst

Odpowiedzi:


33

Uruchom polecenie w podstawieniu polecenia:

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

Dane wyjściowe są teraz przechowywane w outputzmiennej, której możesz używać dowolną liczbę razy.


10
To nie jest poprawna odpowiedź. $? jest.
— mcmlxxxiii

@mcmlxxxiii: $?nie zawiera ścieżek.
— choroba

1
Przepraszam, że byłem zdezorientowany niewłaściwym użyciem tego terminu return. Twoja odpowiedź jest całkowicie poprawna na powyższe pytanie.
— mcmlxxxiii

4
$?zawiera status wyjścia ostatniego polecenia
— Brett Wagner

To była odpowiedź, której szukałem. Interesuje mnie wynik poprzedniego polecenia, a nie wartość zwracana powodzenia / niepowodzenia. Więc dziękuję!
— Joshua Pinter

74

Nie ma do tego specjalnej zmiennej bash.

$? zawiera kod wyjścia ostatniego polecenia (0 = sukces,> 0 = kod błędu)

Możesz użyć wyjścia findz -execflagą, tak jak to:

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

{}Zostanie zastąpiony nazwą pliku znalezionego przez find. Spowoduje to wykonanie polecenia dla każdego znalezionego pliku. Jeśli chcesz wykonać polecenie ze wszystkimi znalezionymi plikami jako argumentami, użyj +na końcu w następujący sposób:

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

Spowoduje to otwarcie jednej instancji emacs z otwartymi wszystkimi znalezionymi plikami .wsdl.

Bardziej ogólnym rozwiązaniem jest przechowywanie danych wyjściowych w zmiennej:

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

Działa to ze wszystkimi poleceniami, nie tylko znajdź. Chociaż możesz również użyć xargs:

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

Czy można $?zwrócić kod wyjścia innego polecenia? np. ping 1.1.1.1 -w 10; zwrócić $?
— twnaing

1
$?zawiera kod wyjścia poprzedniego polecenia, cokolwiek to jest. Tak więc odpowiedź brzmi tak.
— ahilsend

43

Oto szybki hack, który powinien robić to, co chcesz, przy minimalnym naciśnięciu klawisza, jeśli nie przeszkadza ci, że ostatnie polecenie jest wykonywane dwukrotnie.

Użyj strzałki wstecz, ala:

`!!`

na przykład

$ znajdź. -nazwa HardToFind.txt
some / crazy / path / to / HardToFind.txt
$ vim `!!`

* edytuj: Widzę, że powyższe link „możliwe zwielokrotnienie” również zawiera tę odpowiedź. nadal dotyczy bezpośrednio tego, więc zostaw to, ale przepraszam za duplikat.


2
Bardzo mądry. Myślę, że powinna to być zaakceptowana odpowiedź, ponieważ rozwiązuje najczęstszy przypadek, gdy nie wiesz, że potrzebujesz danych wyjściowych, dopóki nie uruchomisz już polecenia.
— Paul Ruane,

1
Zgadzam się, właśnie tego tu szukałem. Wykonanie czegokolwiek w poprzednim wierszu jest sprzeczne z moim celem, aby z mocą wsteczną zdecydować, że chcę zrobić coś z ostatnią zwracaną wartością. (Zapłać gałąź, którą znalazłem git br | grepw moim przypadku)
— Jack Casey

To jedno z moich ulubionych! Myślę, że robię to na co dzień.
— MetalGodwin

Myślę, że to bardzo sprytne, że możesz to zrobić, ale nie jestem pewien, jak naprawdę jest to przydatne. Czy pisanie !!jest o wiele łatwiejsze niż naciśnięcie klawisza w górę? I wtedy nadal możesz zobaczyć swoje polecenie. Jeśli ponowne uruchomienie polecenia jest dopuszczalne, myślę, że naciśnięcie przycisku jest tak samo łatwe (i nieco bardziej zrozumiałe i przejrzyste),
— Svend Hesselholt Henne Hansen
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.