Не могу "продолжить", если я передам вывод - PullRequest
1 голос
/ 05 февраля 2020

У меня есть сценарий bash, который выполняет почти все, что я хочу, используя следующую структуру:

for x in 1 2 3
do
  {
  [[ $x -ne 2 ]] || continue
  echo $x
  } &>> foo.log
done

Мне нужно изменить его, чтобы вывод шел как в терминал, так и в файл журнала. Это, однако, не работает:

for x in 1 2 3
do
  {
  [[ $x -ne 2 ]] || continue
  echo $x
  } 2>&1 | tee -a foo.log
done

Похоже, что при создании процесса канал не позволяет мне использовать continue.

Конечно, я мог бы переписать logi c моего сценария без continue, но прежде чем я начну в этом, я задаюсь вопросом, упускаю ли я более простой способ достичь того, чего я хочу.

1 Ответ

3 голосов
/ 05 февраля 2020

Вы можете перенаправить вывод в подстановку процесса.

for x in 1 2 3
do
  {
  [[ $x -ne 2 ]] || continue
  echo $x
  } 2>&1 > >(tee -a foo.log)
done |
# I suggest to do pipe the output to ex. `cat`, so that the output 
# of process substitution will be synchronized with rest of the script
cat

Но почему бы просто не перенаправить вывод всего l oop?

for x in 1 2 3; do
  [[ $x -ne 2 ]] || continue
  echo $x
done 2>&1 | tee -a foo.log

Вы можете выйти из подпроцесс. Если вы сделаете это, я бы предложил заменить { } на ( ) просто для безопасности, если вы однажды решите удалить tee.

for x in 1 2 3
do
  {
  [[ $x -ne 2 ]] || exit
  echo $x
  } 2>&1 | tee -a foo.log
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...