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.