Redireciona a saída na metade de um script e restaura depois

2

Eu gostaria de redirecionar o stdout na metade de um script. Como posso fazer isso no Zsh?

# Do something
# ... 

# Redirect stdout to a file (e.g. foo.txt)
for x in *;
print $x;
done
# Re-direct stdout back to default

# Do something else
# ... 
    
por Josh 23.01.2014 / 22:25

2 respostas

5

Use o exec incorporado com um redirecionamento, mas nenhum comando para redirecionar os descritores de arquivos do shell. Se você quiser restaurar o destino original, terá que salvá-lo em outro descritor.

exec 3>&1 >foo.txt
for x in *; do
  print $x
done
exec >&3 3>&-

Quando o escopo do redirecionamento é uma parte do código, é mais simples colocar o redirecionamento em torno desse pedaço de código.

for x in *; do
  print $x
done >foo.txt

Se você quiser aplicar um redirecionamento a uma sequência de instruções, coloque-o entre chaves.

{
  for x in *; do
    print $x
  done;
  echo 'one more line'
} >foo.txt

Essas construções existem em todos os shells do tipo Bourne / POSIX, não apenas no zsh.

    
por 24.01.2014 / 00:42
1

Você pode redirecionar a saída de for facilmente com:

for foo in list; do
    somethingto $foo
done > /path/to/forloop_log.txt

Isso só redirecionará a saída do loop for e não afetará a saída antes ou depois dela.

Você pode realizar o mesmo para praticamente qualquer comando ou conjunto de comandos usando um subshell:

dosomething
( dosomethingelse; doyetanotherthing; ) > /path/to/special.log
dostillanotherthing
    
por 23.01.2014 / 22:45