Chciałbym uprościć dane wyjściowe skryptu, tłumiąc wyniki poleceń pomocniczych, które zwykle są skuteczne.
Jednak użycie -q
na nich ukrywa dane wyjściowe, gdy czasami zawodzą, więc nie mam możliwości zrozumienia błędu. Ponadto te polecenia rejestrują swoje dane wyjściowe stderr
.
Czy istnieje sposób na wyłączenie wyniku polecenia tylko, jeśli się powiedzie ?
Na przykład (ale nie tylko) coś takiego:
mycommand | fingerscrossed
Jeśli wszystko pójdzie dobrze, fingerscrossed
łapie wyjście i odrzuca je. W przeciwnym razie powtarza to na wyjściu standardowym lub wyjściowym błędu (cokolwiek).
scripting
error-handling
Matthieu Napoli
źródło
źródło
moreutils
. W każdym razie fajnie dla mnie :)To prawdopodobnie powinno załatwić sprawę. Buforuje dane wyjściowe każdego z nich
command
do usuniętego pliku tymczasowego, a następnie wysysa dane wyjściowe do jednego/dev/null
lub do stderr, w zależności od tego, czy jego status powrotu nie był równy zero. Ponieważ plik tymczasowy jest usuwany przed czasem, nie może zostać odczytany przez żaden proces, ale bieżąca powłoka i jej elementy potomne na swoim deskryptorze pliku (z wyjątkiem podstępnych/proc/$pid/fd
szpiegów z odpowiednimi uprawnieniami) , i nie wymaga czyszczenia po zakończeniu .Być może wygodniejsze rozwiązanie w systemach Linux:
..., które w większości powłok, działa podobnie jak drugi, poza tym, że można nazwać to tak:
divert some simple-command with args
. Strzeż wysokich poleceń wyjściowych w"$@"
, choć dladash
,yash
lub jakieś inne pociski, które zrobienia-dokumentów z rurami - Myślę, że może to być możliwe w tych muszli wypełnić bufor rury (przy domyślnie około 128kb na dystrybucji Linksa) i tak impasu . To nie powinno być zmartwieniemksh
,mksh
,bash
,zsh
, lub powłoka Bourne'a, choć - wszyscy ci zrobić w zasadzie to samo co ja wyraźnie powyżejexec
.źródło
Zwykle w przypadku błędu polecenie wyświetla komunikaty,
stderr
więc dla zadania, które możesz po prostu pominąćstdout
źródło
stderr
(więc nie ma to wpływu).Aby stworzyć własną chroniczną
źródło
Robię coś takiego w moich plikach makefile:
Dostosowując to do swojej sytuacji, możesz zrobić coś takiego:
Zatem „if” uruchamia polecenie i przesyła dane wyjściowe do mycommand.log. Jeśli chcesz złapać stdout vs stdout vs cokolwiek, może być konieczna zmiana polecenia potoku „&>” na „>”. Jeśli polecenie nie powiedzie się, przechwyć kod błędu, wydrukuj zawartość pliku mycommand.log, usuń plik mycommand.log, a na koniec powróć z oryginalnym kodem błędu.
Bez (exit $ c) powróciłbyś z kodem wyjścia, który pasuje do tego, co zwróciło polecenie rm.
Wreszcie, jeśli chcesz mieć jedną wkładkę, coś takiego działałoby.
źródło
(...)
taki sposób? Ponieważ nie robi nic przydatnego, ale spawnuje dodatkowe podpowłoki.(exit $c)
ustawia$?
, czego nie można zrobić inaczej.if ! (mycommand) &>x
ma znaczenie dla przekierowania, jeśli polecenie używa np.time
lub dałoby błąd powłoki.{ ; }
curlies ... choćexit
jest to trochę trudne, co prawda.$?
, możesz po prostu użyć,exit $c
ale tak, w innych przypadkach(exit $?)
ma wartość (choćrret() { return $1; }
generalnie funkcja powłoki byłaby lepsza, argumentowałbym). Jednak podpowłoka dla poleceń wciąż nie jest tak jak wskazywał mikeserv.Właśnie znalazłem tę o wiele prostszą odpowiedź na inne pytanie :
Działa jak marzenie!
źródło