Me gustaría que mi script salga a la salida estándar a menos que obtenga un nombre de archivo como argumento. Una forma obvia es así:
if [ -e "$1" ]; then
command_with_output >$1
else
command_with_output
fi
Es bastante feo y tiene repeticiones, así que me gustaría una forma más concisa de hacerlo.
Intenté lo siguiente, pero no funciona.
[ -e "$1" ] && outfile=$1 || outfile='&1'
command_with_output >$outfile
Editar: esto no cambia la relevancia de las respuestas, pero después de hacer la pregunta me di cuenta de que eso touch "$1" && outfile=$1
es realmente lo que necesito, ya [ -e "$1" ] && outfile=$1
que es posible que el archivo no exista ya y quiero asegurarme de poder escribir en él o crearlo. ello, no sólo que existe. No voy a cambiar la pregunta porque desincronizaría las respuestas.
Respuesta1
exec
se puede utilizar para redirigir la salida estándar del script actual a otro archivo.
[ -e "$1" ] && exec > $1
command_with_output
Respuesta2
Otra forma es usarlo $1
como nombre de archivo si se pasó y /dev/stdout
en caso contrario (que es un enlace simbólico en /proc/self/fd/1
Linux y un nodo de dispositivo con el mismo significado en muchas otras variantes de Unix). Por ejemplo, ponga esto en la parte superior del script:
if [ -e "$1" ]; then
filename=$1
else
filename=/dev/stdout
fi
Y luego redirigir la salida de cada comando a$filename
Respuesta3
Si no requiere más que parámetros de archivo, esto también funcionará:
command_with_output > ${1:-/dev/stdout}
editar: O mejor aún, ya que probablemente también te preocupen los errores:
command_with_output &> ${1:-/dev/stdout}