Я хотел бы, чтобы мой скрипт выводил в 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}