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.