Come reindirizzare l'output e uscire in caso di errore del comando?


1

Ecco come registro sia stdout che stderr nei miei script (di solito cronjobs):

#!/bin/bash
mylog() {
    echo "[`date '+%Y-%m-%d %H:%M:%S'`] $1"
}
(
mylog 'start'

some-command || mylog 'error' && exit 1

mylog 'end'
) >> /var/log/my-log.log 2>&1

In alcuni script uso return invece di exit e funziona bene, ma ora dice che non posso usare return se non includo lo script con src o lo uso in una funzione. Quindi l'ho modificato per uscire, ma il problema è che non registra nulla, sembra che interrompa il >> reindirizzamento dell'output. Un altro problema è che non sarò in grado di includerlo in seguito con src, perché voglio solo interrompere questo script, non tutto.

Uso il reindirizzamento dell'output perché voglio registrare tutto, anche se non si è verificato alcun errore. E a volte i comandi non restituiscono nemmeno i codici di uscita appropriati, quindi non posso fidarmi di questo.

Quindi, come posso "restituire" in caso di errore? Conosco "set -e", ma preferisco avere un maggiore controllo su quando interrompere lo script.

qualche idea?

Risposte:


1

Non riesco a spiegare il comportamento che stai riscontrando, ma ecco una possibile soluzione:

#! / Bin / bash
mylog () {
    echo "[$ (data '+% Y-% m-% d% H:% M:% S')] $ 1"
}

il mio principale() {
    (
        mylog 'start'

        un po 'di comando || mylog 'errore' && return 1

        mylog 'end'
    ) >> /var/log/my-log.log 2> & 1
}

il mio principale

In alternativa, rimuovere il reindirizzamento dalla mymaindefinizione della funzione e inserirlo nella mymainchiamata di funzione:

mymain >> /var/log/my-log.log 2>&1

(Dovresti anche essere in grado di eliminare le parentesi dalla mymaindefinizione della funzione.) In alternativa, poiché desideri che il reindirizzamento di IO venga eseguito per l' intero script, puoi interrompere il reindirizzamento a parte le istruzioni dell'azione:

exec >> /var/log/my-log.log
exec 2> & 1
il mio principale

Dal momento che non capisco perché il tuo approccio non sta funzionando, non posso spiegare perché una delle precedenti abbia più probabilità di funzionare come desiderato. Tuttavia, sono modi leggermente diversi di fare la stessa cosa, e potrebbe essere sufficiente. A proposito, sono passato `date …`a $(date …)motivi generali; Non credo che abbia nulla a che fare con il tuo problema.


Sì, ho pensato di usare mymain. Potrebbe bastare, lo proverò, grazie.
ChocoDeveloper

0

Che ne dici di usare il screencomando in linux? Ciò sarebbe dovuto al trucco, a meno che tu non abbia il cuore di programmare una soluzione da solo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.