bash, как выбрать, добавлять ли в перенаправлении переменную (используйте> или >> в соответствии с $ append) - PullRequest
2 голосов
/ 22 января 2020

Мне нужно в скрипте или функции, чтобы направить вывод в файл журнала и, в зависимости от переменной, решить, должен ли я добавить или переопределить

должно быть что-то вроде этого (что, очевидно, не работа ..)

if [ "$append" = "true" ] ; then direction=">>" ; else direction=">" ; fi
echo $message "$direction" $targetFile

, а не тривиальный ответ по использованию 2-х разделенных команд с оператором "if"

При последующем редактировании здесь есть предполагаемый дублирующий вопрос, здесь: Условно перенаправление добавление / перезапись , однако, мне нравится, что Иван отвечает здесь лучше, чем ответы в других постах

Ответы [ 2 ]

3 голосов
/ 22 января 2020

Solution1: открыть выделенный дескриптор файла в нужном режиме.

if [ "$append" = "true" ] ; then
  exec 3>>"$targetFile"
else
  exec 3>"$targetFile"
fi
# Output to targetFile using the pre configured mode
echo "$message" >&3 

Solution2: всегда добавлять, но условно стирать, перезаписывать содержимое файла:

if [ ! "$append" = "true" ] ; then
  # Reset target file
  > "$targetFile" # same effect as overwrite
fi
echo "$message" >> "$targetFile"

Краткая форма:

[ "$append" = "true" ] || > "$targetFile"
echo "$message" >> "$targetFile"
3 голосов
/ 22 января 2020

Используйте тройник

if [ "$append" = "true" ] ; then direction="-a" ; else direction= ; fi
echo $message | tee "$direction" $targetFile

От помощи тройника

$ tee --help
Usage: tee [OPTION]... [FILE]...
Copy standard input to each FILE, and also to standard output.

  -a, --append              append to the given FILEs, do not overwrite
...

Поиграл с этим немного

write_to_file () { tee           $2 $1; }
apend_to_file () { write_to_file $1 -a; }

case "$append" in
    1|[Yy]|[Yy]es|[Tt]|[Tt]rue) direction=apend_to_file;;
    *                         ) direction=write_to_file;;
esac

echo            $direction
echo $message | $direction $targetFile
...