za pomocą
time sleep 1
daje:
$ time sleep 1
real 0m1.005s
user 0m0.001s
sys 0m0.001s
czy istnieje polecenie, którego mogę użyć do wydrukowania kodu wyjścia, sleep
lub dowolne polecenie, które chcę uruchomić?
Coś jak:
$ log-exit-code sleep 1
może to wystarczy?
sleep 1 && echo "$?"
exit
exit-status
Alexander Mills
źródło
źródło
sleep 1 && echo $?
wydrukowałby kod komórki sypialnej tylko wtedy, gdy będzie zero ...sleep 1 && echo "$?" || echo "$?"
EXIT_CODE=$(tellexit command)
Odpowiedzi:
W moich dotychczasowych testach zadziałało:
command && echo "$?" || echo "$?"
Po prostu każe powtórzyć kod wyjścia, jeśli się powiedzie lub jeśli się nie powiedzie.
Jak wskazał Sato poniżej, jest to w zasadzie to samo, co:
command; echo "$?"
Jedną z rzeczy, które mogą sprawić, że wartościowe i / lub polecenia będą warte zachodu, są:
command && echo "Success! Exit Code: $?" || echo "Failure! Exit Code: $?"
Jeśli potrzebujesz skryptu, aby działał na kodzie wyjścia, co jest problemem Oliviera, nie jest to problem. Twój skrypt może wyglądać mniej więcej tak:
źródło
command; echo $?
?command; echo $?
jest znacznie lepszą odpowiedzią.command ; echo $?
ponieważecho $?
zawsze się to udaje, a zatem po nim nowa wartość $? jest teraz 0. Istnieje sposób na zachowanie oryginalnego kodu powrotu nawet po jego wyświetleniu, na wypadek, gdyby ten oryginalny kod przydał się później (na przykład: w skrypcie sprawdzenie kodu powrotu jest ważne przed podjęciem decyzji o kontynuacji). Zobacz moją odpowiedź na jedno z kilku rozwiązań (większość odpowiedzi tutaj można zmienić w ten sam sposób)cmd && echo "$?"
nie działałby, ponieważ z konieczności drukowałby tylko zera (echo
działałby tylko po pomyślnym zakończeniu poprzedniego polecenia).Oto funkcja krótkiej powłoki:
Spowoduje to wydrukowanie kodu wyjścia danego polecenia w podobny sposób jak
time
polecenie.Przez przekierowanie
printf
do/dev/tty
w funkcji, możemy nadal korzystaćtellexit
z przekierowań bez uzyskiwania śmieci w naszych standardowych strumieni wyjściowych lub błędach:Zapisując kod wyjścia w zmiennej, możemy zwrócić go wywołującemu:
Bardziej zaawansowana wersja tej samej funkcji drukuje również sygnał, który zabił polecenie, jeśli kod wyjścia jest większy niż 128 (co oznacza, że został zakończony z powodu sygnału):
Testowanie:
(
local
Rzecz wymagaash
/pdksh
/bash
/zsh
, lub możesz to zmienić, natypeset
co rozumie także kilka innych powłok).źródło
Użyj funkcji otoki powłoki. Prawdopodobnie pod inną nazwą.
(To oczywiście spowoduje uszkodzenie standardowego wyjścia, więc albo użyj tego,
tty
co pokazano @Kusalananda, albo nie używaj go poza interaktywnymi kontekstami.)Zeskakując w nieznane terytorium, niektóre powłoki mogą raportować status wszystkich poleceń w potoku, nie tylko ostatniego, np. W ZSH, jeśli chcesz zgłaszać awarie z całego potoku:
TRAPZERR
w przeciwnym razie nie będzie uruchamiany, gdy nie wystąpi błąd (na zasadzie „brak wiadomości to dobra wiadomość”).źródło
GNU
time
ma taką opcję:Przechodzi przez kod wyjścia 1 , chyba że zabije go sygnał 2 :
Jeśli chcesz znać / radzić sobie z sytuacją zabicia sygnału, przekaż
-v
stderrowi łańcucha znaków i grepCommand terminated by signal
.1 Podziękowania dla Oliviera Dulaca za zauważenie, że kod wyjścia przechodzi.
2 Ponadto dziękuję Stéphane Chazelas za wskazanie, że kod wyjścia sygnału zabicia nie przechodzi.
źródło
0
jednak, jeśli polecenie zostanie zabite.256+signum
lub384+signum
nawet,signum/256
lubsignum/256+0.5
jeśli rdzeń został wygenerowany (w rzeczywistości status zwracany przezwaitpid()
podzielone przez 256). Niektórzy podają tekstową reprezentację (jaksigint
lubsigquit+core
). Prawdopodobnie nadal warto dyskutować na grupie dyskusyjnej gnu.coreutils.bugs Zgadzam się.time
nie jest częściącoreutils
, jest samodzielnym pakietem z własną listą błędów ([email protected]))system()
tradycyjny awks, taki jak ten nadal utrzymywany przez Briana Kernighana (thek
inawk
) lubnawk
Solaris,awk
FreeBSD, które z tego wywodzą.awk 'BEGIN{print system("kill -s ABRT $$")}'
wyprowadza,0.523438
gdy wielkość zrzutu rdzenia nie jest ograniczona. Zachowaniegawk
zmieniło się ostatnio, z różnym zachowaniem z--traditional
lub--posix
(patrz także wartość zwracanaclose(cmd)
po więcej zmian)Nie lubię wszystkich innych odpowiedzi (choć bardzo lubię ich spryt): wyświetlają kod wyjścia, ale również ZMIENIAJĄ. (wyświetlana część jest prawdziwa, stąd kod powrotu to 0)
Oto zmodyfikowana wersja:
źródło
time
która nie zawsze jest dostępna.Aby być bardziej niezawodnym, wyślij status wyjścia do osobnego FD, aby można go było obsługiwać niezależnie od stdout / stderr:
Pamiętaj, że musisz coś zrobić z FD3, inaczej powie
Bad file descriptor
.Można to dodatkowo skonfigurować w celu dostarczenia tych wyjść do wejść innego programu poprzez umożliwienie temu programowi nasłuchiwania na więcej niż jednym FD; możesz użyć tego jako czegoś w rodzaju Kibany z początku lat 90. :)
źródło
Podczas gdy wszystkie inne (bardzo interesujące) odpowiedzi dotyczą dokładnie pytania, które zadał OP, w praktyce rzeczy są zwykle prostsze. Po prostu zapisujesz status wyjścia w zmiennej (bezpośrednio po poleceniu) i zgłaszasz go lub logujesz w dowolny sposób. Np. Wydrukuj do / dev / stderr lub napisz / dołącz jako wiadomość tekstową do pliku dziennika. Jest także zachowany do użycia w procesie decyzyjnym / kontroli przepływu w kolejnym kodzie.
Jeśli jest w funkcji:
Jeśli jest bezpośrednio w skrypcie:
(Chowanie i ukrywanie, bo to nie odpowiada na dokładne pytanie.)
źródło