Перенаправить вывод на полпути через скрипт и восстановить позже

Я хотел бы повторно перенаправить stdout на полпути через скрипт. Как я могу это сделать в Zsh?

# Do something # ... # Redirect stdout to a file (eg foo.txt) for x in *; print $x; done # Re-direct stdout back to default # Do something else # ... 

  • Как создать цепочку команд?
  • печать строки "canonical print-escaped form"
  • Как проверить, запрашивалась ли предыдущая команда для ввода?
  • В zsh разница между cat <(cat) и cat | cat против cat = (кошка)?
  • Что используется сначала, .bashrc или .zshrc?
  • zsh сохраняет историю обмена даже при отключенной общей истории
  • zsh удалить часть приглашения
  • $ {# array} vs $ {# array }
  • 2 Solutions collect form web for “Перенаправить вывод на полпути через скрипт и восстановить позже”

    Используйте exec builtin с перенаправлением, но нет команды перенаправлять дескрипторы файла оболочки. Если вы хотите восстановить исходный пункт назначения, вам придется сохранить его в другом дескрипторе.

     exec 3>&1 >foo.txt for x in *; do print $x done exec >&3 3>&- 

    Когда область перенаправления является частью кода, проще перенаправить перенаправление вокруг этой части кода.

     for x in *; do print $x done >foo.txt 

    Если вы хотите применить перенаправление к последовательности инструкций, поместите его внутри фигурных скобок.

     { for x in *; do print $x done; echo 'one more line' } >foo.txt 

    Эти конструкции существуют во всех оболочках типа Bourne / POSIX, а не только в zsh.

    Вы можете перенаправить вывод for достаточно легко:

     for foo in list; do somethingto $foo done > /path/to/forloop_log.txt 

    Это будет только перенаправлять вывод цикла for и не влиять на вывод до или после него.

    Вы можете сделать то же самое для почти любой команды или набора команд, используя подоболочку:

     dosomething ( dosomethingelse; doyetanotherthing; ) > /path/to/special.log dostillanotherthing 
    Linux и Unix - лучшая ОС в мире.