Bash: выводит переменную, содержащую вывод программы, в файл

Когда я выполняю унисон-туры 2> / dev / null | grep -A 2 '<-? ->' в приглашении bash, я получаю точный вывод, который ищу:

*changed  <-?-> changed    Future Tours/File Clash Test.docx  
local        : changed file       modified on 2013-06-05 at 16:24:40  size 10221     rw-rw----  
bj-server... : changed file       modified on 2013-06-05 at 16:23:53  size 10232     rw-rw----*

Когда я помещаю это в сценарий оболочки:

#!/bin/bash
tmp=$(unison tours 2> /dev/null | grep -A 2 '<-?->')
echo "$tmp" > /home/users/itsystem/test.log

... выходит странно. Запустив больше test.log, я получаю следующее:

 - Системные ведомости / Обратная связь She
                                                                ппа).xls
| Прошедшие туры /2012/CE0
                        12 Cherry (N... наши меню / Лицзян Тур Menus.xls

- Прошедшие туры /2012/UC041112 St
- Прошедшие туры /2012/UC081112 Lopata (N... Меню - UC081012 Lo
                2/VC110912 Левин (VI... Меню - VC110912 Левин (VI).xlsx
                                                                    XLSX
| Будущие туры /2013 Futur
/ Справки / Выдающиеся / Теренс Парк... Маршрут (Трев
изменено изменено Будущие туры / Файл Clash Test.docx
local: измененный файл изменен 2013-06-05 в 16:24:40 размер 10221     rw-rw----
bj-сервер...: измененный файл изменен 2013-06-05 в 16:23:53 размер 10232     rw-rw---- 

Откуда взялась другая хрень?

Если вы просто запустите unison, вы получите анимированную строку вывода, которая постоянно обновляется вращающейся -\|/, показывая рабочую папку, но которая в конечном итоге исчезает.

Если мой grep работает в командной строке bash, то почему не из сценария оболочки?

1 ответ

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

Другие вопросы по тегам