Come fermare il reindirizzamento in bash


8

Io uso :

exec >script.log 2>&1

nel mio script per reindirizzare tutto l'output su un file. Alla fine della sceneggiatura vorrei stampare un messaggio sullo schermo. Come posso interrompere il reindirizzamento?

Risposte:


12

È possibile chiamare execnuovamente per ripristinare i descrittori originali. Dovrai averli salvati da qualche parte.

exec 3>&1 4>&2 1>script.log 2>&1
… logged portion …
exec 1>&3 2>&4
echo >&2 "Done"

All'interno della parte registrata, è possibile utilizzare i descrittori originali per un comando reindirizzando ai descrittori aggiuntivi.

echo "30 seconds remaining" >&3

In alternativa, puoi inserire la parte registrata dello script in un comando composto e reindirizzare quel comando composto. Questo non funziona se si desidera utilizzare i descrittori originali in una trappola da qualche parte all'interno di quella parte reindirizzata.

{
… logged portion …
} >script.log 2>&1
echo >&2 "Done"

L'osservazione sull'eco per >&3rendere questa la mia soluzione preferita. Grazie ancora)!
— Willem,

6

Usa adddinal fd 3 e 4 per stdout e stderr e reindirizza semplicemente 1 e 2 a loro alla fine del tuo script:

exec 3>&1 4>&2
exec >script.log 2>&1

echo "Some code"

exec >&3 2>&4
echo "Done"

Questo restituisce un errore:exec 3>/dev/stdout 4>/dev/stderr -bash: /dev/stdout: Permission denied
— Willem,

Questo errore può verificarsi quando si tenta di avviare lo script all'interno di un altro utente. Usi il tuo script tramite sudo?
— corsa il

Sì, è tutto: ho fatto una richiesta su un altro account ed ho eseguito il codice. Lo script che sto scrivendo verrà eseguito tramite sudo, quindi incontrerò lo stesso problema lì. C'è un'alternativa?
— Willem,

Credo che ci sia qualche soluzione elegante, purtroppo conosco l'unica opzione, che potrebbe essere assolutamente inaccettabile dal punto di vista della sicurezza: aggiungi il tuo utente di destinazione al tuo gruppo primario di utenti iniziale e aggiungi le autorizzazioni di scrittura di gruppo per / proc / self / fd / 1 prima del lancio dello script. (o ancora più vulnerabile: concedi l'autorizzazione di scrittura temporanea a tutti e rimuovila subito dopo che lo script è terminato senza modifiche di gruppo).
— corsa il

1
@Willem Questo si risolve facilmente usando i descrittori di file invece di riaprire i file, vedi la mia modifica.
— Gilles 'SO- smetti di essere malvagio' il

1

Per prima cosa dovresti controllare se hai un tty o meno.

if tty -s; then
    echo "Hello, World" > $(tty)
fi

1
Si noti che in questo modo non è possibile alimentare l'output a un programma esterno.
— corsa il

Non è necessario utilizzare l' ttyutilità esterna . Puoi reindirizzare al dispositivo speciale /dev/tty.
— In pausa fino a nuovo avviso.
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.