Manera concisa de enviar al archivo si se proporciona un argumento, de lo contrario, realizar la salida estándar

Manera concisa de enviar al archivo si se proporciona un argumento, de lo contrario, realizar la salida estándar

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=$1es realmente lo que necesito, ya [ -e "$1" ] && outfile=$1que 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

execse 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 $1como nombre de archivo si se pasó y /dev/stdouten caso contrario (que es un enlace simbólico en /proc/self/fd/1Linux 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}

información relacionada