bash: ustawia logi-x do pliku

11

Mam skrypt powłoki z set -x , aby mieć wyjście verbose / debug:

#!/bin/bash

set -x
command1
command2
...

Dane wyjściowe wyglądają następująco:

+ command1
whatever output from command1
+ command2
whatever output from command2

Mój problem polega na tym, że wyjście powłoki (spowodowane przez set -x ) przechodzi do stderr, zmieszane z danymi wyjściowymi poleceń ( command1 , command2 , ...). Byłbym szczęśliwy mając "normalny" wynik na ekranie (jak skrypt woud działający bez set -x ) i "dodatkowy" wynik bash oddzielnie w pliku.

Tak więc chciałbym mieć to na ekranie:

whatever output from command1
whatever output from command2

i to w pliku dziennika:

+ command1
+ command2

(również dobrze, jeśli plik dziennika zawiera wszystko razem)

set -x 2> file oczywiście nie przyniesie właściwego efektu, ponieważ nie jest wynikiem polecenia set, ale zmienia zachowanie bash.

Używanie bash 2> file dla całego skryptu również nie działa dobrze, ponieważ przekierowuje stderr każdego polecenia, które działa również w tej powłoce, więc nie widzę komunikatu o błędzie poleceń.

    
zadawane redseven 12.08.2016, 14:43
źródło

3 odpowiedzi

1

Po ponad roku znalazłem właściwe rozwiązanie, aby mieć zarówno "normalne" wyjście (stdout + stderr - bash trace) na ekranie i wszystkie razem (stdout + stderr + bash trace) w pliku (bash .log):

exec   > >(tee -ia bash.log)
exec  2> >(tee -ia bash.log >& 2)
exec 19> bash.log

export BASH_XTRACEFD="19"
set -x

command1
command2
    
odpowiedział redseven 30.01.2018, 16:23
źródło
12

Na podstawie tej odpowiedzi ServerFault Wyślij dane wyjściowe bash -x do pliku dziennika bez zakłócania standardowego wyjścia , nowoczesne wersje bash zawierają BASH_XTRACEFD specjalnie dla określenia alternatywnego deskryptora pliku dla wyjścia set -x

Możesz na przykład zrobić

#!/bin/bash

exec 19>logfile
BASH_XTRACEFD=19

set -x
command1
command2
...

, aby wysłać wynik set -x do pliku logfile , zachowując standardowe standardowe wyjście i standardowe strumienie błędów dla następujących poleceń.

Zauważ, że użycie fd 19 jest arbitralne - musi to być dostępny deskryptor (tzn. nie 0, 1, 2 lub inny numer, który już został przydzielony).

    
odpowiedział steeldriver 12.08.2016, 15:33
źródło
3

Steeldriver dał ci jedno podejście. Alternatywnie możesz po prostu przekierować STDERR do pliku:

script.sh 2> logfile

To jednak oznacza, że ​​zarówno dane wyjściowe utworzone przez opcję set -x , jak i wszystkie inne wygenerowane komunikaty o błędach zostaną przesłane do pliku. Rozwiązanie Steeldrivera przekieruje jedynie set -x , czego prawdopodobnie potrzebujesz.

    
odpowiedział terdon 14.08.2016, 14:17
źródło

Przeczytaj inne pytania na temat tagów