Перенаправление Bash с файловым дескриптором или именем файла в переменной - PullRequest
11 голосов
/ 05 ноября 2010

В моем сценарии я хочу иметь возможность записи в файл или в стандартный вывод на основе определенных условий.Мне любопытно, почему это не работает в моем сценарии:

out=\&1
echo "bird" 1>$out

Я пробовал разные комбинации кавычек, но я продолжаю создавать файл "& 1" вместо того, чтобы записывать в stdout.Что я могу сделать, чтобы заставить это работать так, как я хочу?

Ответы [ 5 ]

5 голосов
/ 05 ноября 2010

Возможно, более безопасной альтернативой eval является дублирование пункта назначения во временный дескриптор файла, используя exec (дескриптор файла 3 в этом примере):

if somecondition; then exec 3> destfile; else exec 3>&1; fi

echo bird >&3
2 голосов
/ 01 апреля 2015

С 2015 года возможно перенаправление на >&${out}. Например.,

exec {out}>&1
echo "bird" 1>&${out}
2 голосов
/ 05 ноября 2010

Излагая ответ Диего. Чтобы изменить, где стандартный вывод идет условно

if [ someCondition ] ; then
  # all output now goes to $file
  exec 1>$file
fi

echo "bird"

Или создайте собственный дескриптор файла;

if [ someCondition ] ; then
  # 3 points to stdout
  exec 3>&1
else
  # 3 points to a file
  exec 3>$outfile
fi

echo "bird" >&3

Адаптировано из: Программирование csh считается вредным - проверьте его на предмет некоторых приемов перенаправления. Или прочитайте справочную страницу bash.

1 голос
/ 05 ноября 2010

Я почти уверен, что это связано с порядком, в котором bash обрабатывает командную строку. Следующие работы:

export out=\&1
eval "echo bird 1>${out}"

потому что подстановка переменной происходит до оценки.

0 голосов
/ 05 ноября 2010

Попробуйте с eval. Он должен работать путем интерпретации значения $out:

out='&1'
eval "echo \"bird\" 1>$out"

Будет печатать bird на стандартном выходе (и в файл, если вы измените out).

Обратите внимание, что вы должны быть осторожны с тем, что происходит внутри строки eval. Обратите внимание на обратную косую черту с внутренними кавычками и на то, что переменная $out замещается (с помощью двойных кавычек) до выполнения вычисления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...