Redirigir todos los estándares para el rest del script

Tengo un script bash que quiero networkingirigir todo el rest de la salida a un file.

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

la salida debe ser spo \ ncar \ n

Solutions Collecting From Web of "Redirigir todos los estándares para el rest del script"

Si networkingirige el stdout para el rest del script, eso includeía el command "cat", por lo que no vería su resultado, el $file podría llenarse indefinidamente con copys recursivas de sí mismo (y lo haría si no fuera así). tan pequeño como para dejar que el cat vea el final antes de comenzar a escribirlo).

Para networkingirigir stdout a partir de ahora, simplemente lo hace:

 exec > "$file" 

Pero aquí tal vez quieras:

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

También puedes hacer cosas como:

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

(y, por cierto, lo anterior es lo que hacen los shells modernos internamente cuando networkingirigir un command compuesto como { some; code; } > ... (aunque usan un fd por encima de 10 y establecen el indicador O_CLOEXEC en él para que los commands ejecutados no lo veo), mientras que el shell Bourne bifurcaría una subcapa en ese caso)

También tenga en count que en el código anterior, no tiene que restaurar stdout para el rest de la secuencia de commands, puede hacerlo solo para el command cat :

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

(el 3>&- (cierre fd 3) no es necesario ya que cat no usa su fd 3 de todos modos, pero es una buena práctica en el caso general, y estrictamente hablando, tendríamos que agregarlo a cada command para emular el Comportamiento O_CLOEXEC del shell).