Dlaczego dane wyjściowe niektórych programów systemu Linux nie są wysyłane do STDOUT ani STDERR?
Właściwie chcę wiedzieć, jak niezawodnie przechwytywać wszystkie dane wyjściowe programu, bez względu na to, jakiego „strumienia” używa. Problemem jest to, że niektóre programy nie pozwalają na przechwycenie ich wyników.
Przykładem jest polecenie „czas”:
time sleep 1 2>&1 > /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
lub
time sleep 1 &> /dev/null
real 0m1.003s
user 0m0.000s
sys 0m0.000s
Dlaczego widzę dane wyjściowe za każdym razem? Spodziewałem się, że wszystko to zostanie przekazane do / dev / null .
Jakiego strumienia wyjściowego używa czas i jak mogę go potokować do pliku?
Jednym ze sposobów obejścia tego problemu jest utworzenie skryptu Bash , na przykład combine.sh
zawierającego to polecenie:
$@ 2>&1
Następnie wynik „czasu” można zarejestrować w prawidłowy sposób:
combine.sh time sleep 1 &> /dev/null
(nie widać danych wyjściowych - poprawnie)
Czy istnieje sposób na osiągnięcie tego, co chcę bez użycia osobnego skryptu łączenia?
2>&1 > /dev/null
środki „2 teraz idzie gdzie 1 idzie (czyli terminal domyślnie), a następnie 1 teraz jedzie do / dev / null (ale 2 wciąż idzie do zacisku!) używać.>/dev/null 2>&1
powiedzieć „1 idzie teraz do / dev / null, a następnie 2 idzie tam, gdzie 1 idzie (tj. Również do / dev / null). To nadal nie działa tutaj, ponieważ wbudowany „czas” nie zostanie przekierowany, ale ogólnie jest poprawny (na przykład działałoby, jeśli użyjesz / usr / bin / time). Pomyśl o „2> & 1” jako kierunek kopiowania „na” 1 za 2, a nie 2 zamiar 1