Вывод Скрипта Bash С Отступом
Я пытаюсь написать сценарий bash, и мне трудно сделать вывод аккуратным и организованным. Я мог бы вернуться к использованию новых строк, но я бы предпочел, чтобы результат был легко читаемым. Например, когда я бегу git clone ...
, Я хочу сначала Эхо "репозиторий клонирования", а затем иметь вывод git
изрезана. Пример вывода:
Cloning repository...
Initialized empty Git repository in /root/client_scripts/jojo/.git/
remote: Counting objects: 130, done.
remote: Compressing objects: 100% (121/121), done.
remote: Total 130 (delta 13), reused 113 (delta 6)
Receiving objects: 100% (130/130), 176.07 KiB, done.
Resolving deltas: 100% (13/13), done.
в настоящее время все сжато без отступов. Кто-нибудь знает, как это сделать? Я попытался с sed
и awk
но он, казалось, не показывал больше выхода, чем просто Initialized empty Git repository in /root/client_scripts/jojo/.git/
. Буду признателен за любые комментарии.
5 ответов
проблема с конвейерным выводом git через любую команду заключается в том, что git обнаружит, что вывод не является терминалом, поэтому он не будет выводить сообщения, которые являются сообщениями о ходе работы, потому что (как правило) не полезно передавать много символов терминала и выполнять обновления к чему-то, что не является терминалом.
чтобы получить сообщения о прогрессе в любом случае, вам нужно предоставить до git clone
. Сообщения появляются на stderr
поэтому вам, вероятно, понадобится труба что-то вроде 2>&1 | ...
.
имейте в виду, что сообщения о ходе выполнения не будут отображаться строка за строкой, но вы получите много кодов выхода терминала, которые предназначены для очистки той же строки. Пытаюсь отступ это выход трубы через линию инструмент типа sed будет трудно, если не невозможно. Для программы, которая может обрабатывать вход без буфера, должно быть вполне возможно искать ^M
в выходной и добавить несколько пробелов (или вкладке) сразу aftwards, промывка так же часто, как и каждый пакет данных.
трубы через
sed "s/^/ /g"
это заменит якорь (нулевой ширины) для начала линии четырьмя пробелами, эффективно добавив четыре пробела в начале линии.
(g делает это глобально; без него он будет делать это только один раз, что будет делать первую строку.)
вы можете отфильтровать вывод из команды, которую вы хотите отступить через sed.
/tmp/test>cat script
#!/bin/sh
echo "Running ls -l"
ls -l 2>&1 | sed 's/^/\t/'
/tmp/test>sh script
Running ls -l
total 4
-rw-rw-r-- 1 hlovdal hlovdal 55 2009-11-03 23:36 script
/tmp/test>
команда sed заменит начало строки (перед первым символом) табулятором, т. е. вставит табулятор в самом начале строки.
обновлено также отступ stderr.
поскольку решение awk еще не было опубликовано:
$ echo -en "hello\nworld\n"
hello
world
$ echo -en "hello\nworld\n" | awk '{print " "}'
hello
world