Per quanto riguarda una soluzione per reindirizzare molti comandi contemporaneamente:
#!/bin/bash
{
somecommand
somecommand2
somecommand3
} 2>&1 | tee -a $DEBUGLOG
Perché la soluzione originale non funziona: exec 2> & 1 reindirizzerà l'output di errore standard all'output standard della shell, che, se si esegue lo script dalla console, sarà la console. il reindirizzamento pipe sui comandi reindirizzerà solo l'output standard del comando.
Dal punto di vista di somecommand, il suo output standard va in una pipe collegata teee l'errore standard va nello stesso file / pseudofile dell'errore standard della shell, che reindirizzi all'output standard della shell, che sarà il console se si esegue il programma dalla console.
L'unico vero modo per spiegarlo è vedere cosa succede davvero:
L'ambiente originale della shell potrebbe apparire così se lo esegui dal terminale:
stdin -> /dev/pts/42
stdout -> /dev/pts/42
stderr -> /dev/pts/42
Dopo aver reindirizzato l'errore standard in output standard ( exec 2>&1), in pratica ... non si modifica nulla. Ma se reindirizzi l'output standard dello script su un file, finiresti con un ambiente come questo:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /dev/pts/42
Quindi il reindirizzamento dell'errore standard della shell nell'output standard finirebbe così:
stdin -> /dev/pts/42
stdout -> /your/file
stderr -> /your/file
L'esecuzione di un comando erediterà questo ambiente. Se si esegue un comando e lo si reindirizza a T, l'ambiente del comando sarebbe:
stdin -> /dev/pts/42
stdout -> pipe:[4242]
stderr -> /your/file
Quindi l'errore standard del tuo comando va ancora in quello che la shell usa come suo errore standard.
Puoi effettivamente vedere l'ambiente di un comando guardando /proc/[pid]/fd: usa ls -lper elencare anche il contenuto del link simbolico. Il 0file qui è input standard, 1output standard ed 2errore standard. Se il comando apre più file (e la maggior parte dei programmi lo fanno), li vedrai anche. Un programma può anche scegliere di reindirizzare o chiudere il suo input / output standard e riutilizzarlo 0, 1e 2.
|&funziona come scorciatoia per2>&1 |, è almeno leggermente più conveniente.