Mam skrypt powłoki, set -x
aby mieć pełne wyjście / debugowanie:
#!/bin/bash
set -x
command1
command2
...
Dane wyjściowe wyglądają następująco:
+ command1
whatever output from command1
+ command2
whatever output from command2
Moim problemem jest to, wyjście shell (spowodowane przez set -x
) idzie do stderr, zmieszanej z wyjściem poleceń ( command1
, command2
...). Byłbym szczęśliwy, gdyby „normalne” wyjście na ekranie (jak skrypt działał bez niego set -x
) i „dodatkowe” wyjście bash oddzielnie w pliku.
Więc chciałbym mieć to na ekranie:
whatever output from command1
whatever output from command2
a to w pliku dziennika:
+ command1
+ command2
(również dobrze, jeśli plik dziennika zawiera wszystko razem)
set -x 2> file
Oczywiście doens't podjąć właściwą efekt, bo to nie jest wyjście z polecenia set, ale to się zmieni zachowanie bash.
Używanie bash 2> file
całego skryptu również nie działa dobrze, ponieważ przekierowuje stderr każdego polecenia, które również działają w tej powłoce, więc nie widzę komunikatu o błędzie poleceń.
źródło
Odpowiedzi:
Na podstawie tej odpowiedzi ServerFault Wyślij wyjście bash -x do pliku dziennika bez przerywania standardowego wyjścia , nowoczesne wersje bash zawierają
BASH_XTRACEFD
specjalnie do określania alternatywnego deskryptora pliku dla wyjściaset -x
Na przykład możesz to zrobić
wysłać dane wyjściowe
set -x
do plikulogfile
, zachowując standardowe standardowe dane wyjściowe i standardowe strumienie błędów dla następujących poleceń.Zauważ, że użycie fd 19 jest arbitralne - musi to być tylko dostępny deskryptor (tzn. Nie 0, 1, 2 lub inny numer, który już przypisałeś).
źródło
Po ponad roku znalazłem właściwe rozwiązanie, aby mieć zarówno „normalne” wyjście (stdout + stderr - ślad bash) na ekranie, jak i wszystkie razem (stdout + stderr + ślad bash) w pliku (bash.log) :
źródło
Steeldriver dał ci jedno podejście. Alternatywnie możesz po prostu przekierować STDERR do pliku:
Oznacza to jednak, że zarówno dane wyjściowe utworzone przez
set -x
opcję, jak i wszelkie inne wygenerowane komunikaty o błędach trafią do pliku. Rozwiązanie Steeldriver przekieruje tylkoset -x
wyjście, które prawdopodobnie jest tym, czego chcesz.źródło