Como parar o redirecionamento no bash

8

Eu uso :

exec >script.log 2>&1

no meu script para redirecionar toda a saída para um arquivo. No final do script, eu gostaria de imprimir uma mensagem na tela. Como faço para parar o redirecionamento?

Willem
fonte

Respostas:

12

Você pode ligar execnovamente para restaurar os descritores originais. Você precisará salvá-los em algum lugar.

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

Dentro da parte registrada, você pode usar os descritores originais para um comando redirecionando para os descritores extras.

echo "30 seconds remaining" >&3

Como alternativa, você pode colocar a parte registrada do seu script dentro de um comando composto e redirecionar esse comando composto. Isso não funciona se você deseja usar os descritores originais em uma armadilha em algum lugar dessa parte redirecionada.

{
 logged portion 
} >script.log 2>&1
echo >&2 "Done"
Gilles 'SO- parar de ser mau'
fonte
A observação sobre ecoar >&3faz desta a minha solução preferida. Obrigado novamente)!
Willem
6

Use fd 3 e 4 adicionais para stdout e stderr e simplesmente redirecione 1 e 2 para eles no final do seu script:

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

echo "Some code"

exec >&3 2>&4
echo "Done"
pressa
fonte
Isso retorna um erro:exec 3>/dev/stdout 4>/dev/stderr -bash: /dev/stdout: Permission denied
Willem
Este erro pode ocorrer quando você está tentando iniciar seu script em outro usuário. Você usa seu script via sudo?
apressar
Sim, é isso: fiz um su para outra conta e executei o código. O script que estou escrevendo será executado via sudo, portanto, vou encontrar o mesmo problema lá. Existe uma alternativa?
Willem
Acredito que exista alguma solução elegante, infelizmente eu conheço a única opção, que pode ser absolutamente inaceitável do ponto de vista da segurança: adicione seu usuário de destino ao seu grupo principal de usuários iniciais e adicione permissões de gravação de grupo para / proc / self / fd / 1 antes do lançamento do script. (ou ainda mais vulnerável - apenas faça permissão de gravação temporária para todos e remova-a logo após a conclusão do script sem alterações de grupo).
apressar
1
@ William Isso é facilmente corrigido usando descritores de arquivos em vez de reabrir os arquivos, veja minha edição.
Gilles 'SO- stop be evil'
1

Primeiro, verifique se você tem ou não um tty.

if tty -s; then
    echo "Hello, World" > $(tty)
fi
David Baggerman
fonte
1
Observe que dessa maneira não é possível alimentar a saída para o programa externo.
apressar
Não é necessário usar o ttyutilitário externo . Você pode redirecionar para o dispositivo especial /dev/tty.
Pausado até novo aviso.