Redirecionar todos os padrões para o resto do script

6

Eu tenho um script bash que eu quero redirecionar todo o resto da saída em um arquivo.

#!/bin/bash
# the part I don't know  ${file}
echo spo 
echo car

cat ${file}

a saída deve ser spo \ ncar \ n

    
por Prospero 24.11.2012 / 21:02

1 resposta

8

Se você redirecionar o stdout para o resto do script, então isso incluiria o comando "cat", para que você não visse sua saída, $file poderia preencher indefinidamente com cópias recursivas de si mesmo (e se não seria tão pequeno a ponto de deixar cat ver o final antes de começar a escrever para ele).

Para redirecionar a stdout de agora em diante, você simplesmente faz:

exec > "$file"

Mas aqui talvez você queira:

#! /bin/bash -
{
  echo spo 
  echo car
} > "$file"

cat < "$file"

Você também pode fazer coisas como:

exec 3>&1 # save stdout as fd 3
exec > "$file"
echo spo
echo car
exec >&3 3>&- # restore stdout and close fd 3
cat < "$file"

(e, a propósito, o acima é o que os shells modernos fazem internamente quando você redireciona um comando composto como { some; code; } > ... (embora eles usem um fd acima de 10 e configurem o flag O_CLOEXEC nele para que os comandos executados não vejam ele), enquanto o shell Bourne iria bifurcar um subshell nesse caso)

Observe também que, no código acima, você não tem para restaurar o stdout para o restante do script. Você pode fazer isso apenas para o comando cat :

cat < "$file" >&3 3>&-

(o 3>&- (fechando o fd 3) não é necessário, pois cat não usa seu fd 3, mas é uma boa prática no caso geral, e estritamente falando, nós teríamos que adicioná-lo a cada comando para emular o comportamento O_CLOEXEC do shell).

    
por 24.11.2012 / 21:09