Краткая инструкция по выводу в файл, если указан аргумент, в противном случае — в stdout

Краткая инструкция по выводу в файл, если указан аргумент, в противном случае — в stdout

Я хотел бы, чтобы мой скрипт выводил в stdout, если только он не получает имя файла в качестве аргумента. Очевидный способ такой:

if [ -e "$1" ]; then
  command_with_output >$1
else
  command_with_output
fi

Это довольно некрасиво и содержит повторы, поэтому я хотел бы сделать это более лаконично.

Я попробовал следующее, но это не сработало.

[ -e "$1" ] && outfile=$1 || outfile='&1'
command_with_output >$outfile

Редактировать: Это не меняет релевантности ответов, но я понял после того, как создал вопрос, что touch "$1" && outfile=$1это действительно то, что мне нужно, [ -e "$1" ] && outfile=$1так как файл может еще не существовать, и я хочу убедиться, что могу писать в него или создать его, а не просто что он существует. Я не меняю вопрос, потому что это нарушит синхронизацию ответов.

решение1

execможет использоваться для перенаправления стандартного вывода текущего скрипта в другой файл.

[ -e "$1" ] && exec > $1
command_with_output

решение2

Другой способ — использовать $1в качестве имени файла, если он был передан, а /dev/stdoutв противном случае (что является символической ссылкой на /proc/self/fd/1в Linux и узлом устройства с тем же значением во многих других вариантах unix). Например, поместите это в начало скрипта:

if [ -e "$1" ]; then
    filename=$1
else
    filename=/dev/stdout
fi

А затем перенаправить вывод каждой команды в$filename

решение3

Если не требуется никаких параметров, кроме файла, это тоже сработает:

command_with_output > ${1:-/dev/stdout}

правка: Или еще лучше, поскольку вас, вероятно, тоже волнуют ошибки:

command_with_output &> ${1:-/dev/stdout}

Связанный контент