Где находится сервер Cygwin NFS?

Во-первых, вы должны избегать echo для вывода произвольных данных .

В системах, отличных от Linux, вы можете использовать:

logfile=/dev/stdout

Для Linux это работает для некоторых типов stdout, но не работает, когда stdout является сокетом или хуже, если stdout является обычным файлом, это могло бы обрезать этот файл вместо записи в текущую позицию stdout в файле.

Кроме этого, в оболочке типа Bourne нет возможности использовать условное перенаправление, хотя вы можете использовать eval :

eval 'printf "%s\n" "$buf" '${logfile:+'> "$logfile"'}

вместо переменной , вы можете использовать специальный файловый дескриптор :

exec 3>&1
[ -z "$logfile" ] || exec 3> "$logfile"

 printf '%s\n' "$buf" >&3

(небольшой) недостаток в том, что, за исключением ksh , утечка fd 3 будет происходить для каждой команды, выполняемой в сценарий. С помощью zsh вы можете выполнить sysopen -wu 3 -o cloexec - "$ logfile" || exit вместо exec 3> "$ logfile" , но bash не имеет эквивалента.

Еще одна распространенная идиома - использовать такие функции, как:

log() {
  if [ -n "$logfile" ]; then
    printf '%s\n' "$@" >> "$logfile"
  else
    printf '%s\n' "$@"
  fi
}

log "$buf"

1
06.03.2016, 06:10
0 ответов

Теги

Похожие вопросы