Ukrywanie danych wyjściowych polecenia powłoki zwykle wymaga przekierowania stderr i stdout. Czy jest jakieś wbudowane narzędzie lub polecenie, które domyślnie ukrywa dane wyjściowe, ale w przypadku błędu zrzuca całe zgromadzone dane wyjściowe? Chciałbym uruchomić to jako opakowanie zdalnych ssh
poleceń. Teraz używam ich przekierowania, ale nie mam pojęcia, co spowodowało, że zawiodły, a oni są po prostu zbyt gadatliwi.
EDYCJA: W końcu stworzyłem następujący szablon na podstawie odpowiedzi @Belmin, którą trochę poprawiłem, aby zgromadzić wszystkie poprzednie polecenia ze skryptu, użyć bieżącego identyfikatora procesu, automatycznie usunąć dziennik i dodać błąd czerwony błąd wiadomość, gdy coś pójdzie nie tak. W tym szablonie początkowe silent
opakowania zakończą się powodzeniem, a następnie zakończą się niepowodzeniem trzeciego polecenia, ponieważ katalog już istnieje:
#!/bin/sh
set -e
SILENT_LOG=/tmp/silent_log_$$.txt
trap "/bin/rm -f $SILENT_LOG" EXIT
function report_and_exit {
cat "${SILENT_LOG}";
echo "\033[91mError running command.\033[39m"
exit 1;
}
function silent {
$* 2>>"${SILENT_LOG}" >> "${SILENT_LOG}" || report_and_exit;
}
silent mkdir -v pepe
silent mkdir -v pepe2
silent mkdir -v pepe
silent mkdir -v pepe2
2>&1
czegoś takiego:$* >>"${SILENT_LOG}" 2>&1" || report_and_exit
Odpowiedzi:
Ja bym tylko konfiguracja funkcja bash tak:
Następnie możesz po prostu uruchomić polecenie:
źródło
/etc/passswd
inny plik krytyczny i nadpisało zawartość.$* > /tmp/surpress.out 2>&1
To naprawdę przechwytuje stderr.$*
nie jest najlepszy do obsługi dowolnych danych wejściowych. Zwłaszcza gdy zawiera spacje lub flagi. Najbardziej przenośny jest${1+"$@"}
według stackoverflow.com/questions/743454/…W tym celu powinno być dość łatwo napisać skrypt.
Coś takiego jak ten całkowicie nieprzetestowany skrypt.
Z drugiej strony dla poleceń, które uruchamiam jako część skryptu, zwykle chcę czegoś lepszego niż po prostu wydrukować wszystkie dane wyjściowe. Często ograniczam to, co widzę, do nieznanego. Oto skrypt, który zaadaptowałem z czegoś, co przeczytałem ponad dziesięć lat temu.
źródło
Nie sądzę, że istnieje czysty sposób na zrobienie tego, jedyne, o czym mogę myśleć
Wdrożenie tego może być ciekawym projektem, ale być może wykraczającym poza pytania i odpowiedzi.
źródło
krótko mówiąc z czymś takim
tehcommand &>/tmp/$$ || cat /tmp/$$
zależy od tego, ile użyteczności / pisania potrzebujesz / potrzebujesz. (np. użycie go jako potoku lub przekazanie polecenia argumentem)
Krótki skrypt @zoredache to po prostu proto-wrapper do tego, co dałoby większą niezawodność, obsługiłoby współbieżność itp.
źródło
Spróbuj tak:
źródło
out="$(command args...)" || echo "$out"