В Bash, как печатать на стандартный вывод, когда он уже перенаправлен? - PullRequest
0 голосов
/ 21 апреля 2019

Я пишу функцию Bash, скажем func() { … }, которая в интерактивном режиме задает пользователю несколько вопросов, а затем запускает определенную команду.

Призом здесь является stdout указанной команды, и я ожидаю, что пользователи будут вызывать мою функцию следующим образом: func >outfile, чтобы записать вывод команды в файл.

Мой вопрос: как мне распечатать эти интерактивные вопросы на stdout, не загрязняя полезный вывод?

Другими словами: если внутри функции, если stdout был потенциально перенаправлен вызывающей стороной, как мне записать в «оригинал» stdout (терминал), временно игнорируя перенаправление вызывающей стороны?

Должен ли я прибегнуть к использованию stderr для вывода, который семантически не принадлежит ему?

1 Ответ

2 голосов
/ 21 апреля 2019

Ответ на оригинальный вопрос

Создайте резервную копию вашего исходного стандартного вывода в тот момент, когда ваша функция определена, и вы можете использовать его во время вызова.

exec {myfunc_stdout_fd}>&1
myfunc() {
  echo "Content sent to stdout as defined at invocation time"
  echo "Content sent to original stdout" >&"$myfunc_stdout_fd";
}

... чего:

myfunc_out=$(myfunc)

... сохраняет Content sent to stdout as defined at invocation time в myfunc_out и немедленно записывает Content sent to original stdout в стандартный вывод, который был определен при определении функции.

Смотрите это в онлайн-переводчике на https://ideone.com/HwHRJ7


Рекомендация Re: оптимальное использование

Подсказки обычно записываются в stderr в UNIX, поэтому для целей, связанных с запросами, сохранение исходного stdout обычно не требуется. Подсказка на stderr - это то, что делает read -p; что делает сам bash (как и другие оболочки); и т. д. Это уместно, так как POSIX определяет stderr как соответствующий поток для «диагностического вывода», который представляет собой категорию, которая включает статус о том, что программа делает в данный момент (готова ли она к дополнительному вводу, f / e).

Смотри также:

...