Отступы Bash Script Выход
Я пытаюсь написать bash script, и у меня возникают трудности с тем, чтобы результат выглядел аккуратным и организованным. Я мог бы вернуться только с использованием новых строк, но я бы скорее сделал вывод, который был легко читаем. Например, когда я запускаю 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/
. Я был бы очень признателен за любые комментарии.
Ответы
Ответ 1
Проблема с конвейером вывода git через любую команду заключается в том, что git обнаружит, что вывод не является терминалом, поэтому он не будет выводить сообщения, которые являются сообщениями о ходе выполнения, потому что (как правило) это не полезно прокладывать множество терминальных символов и обновлять информацию о том, что не является терминалом.
Чтобы получать сообщения о ходе выполнения, вам нужно предоставить опцию --verbose
для git clone
. Сообщения о ходе работы отображаются на stderr
, поэтому вам, вероятно, понадобится труба, похожая на 2>&1 | ...
.
Помните, что сообщения о проделанной работе не будут отображаться по очереди, но вы получите много кодов выхода терминала, которые предназначены для очистки одной и той же строки. Пытаясь сделать отступ, этот вывод, проходящий через линейный инструмент, такой как sed, может оказаться сложным, если не невозможным. Для программы, которая может обрабатывать входные данные без буферизации, должно быть достаточно, чтобы искать ^M
в выводе и добавлять сразу несколько пробелов (или вкладку), покрасняя так же часто, как и каждая партия данных.
Ответ 2
Труба через
sed "s/^/ /g"
Это заменит якорь (нулевой ширины) для начала строки четырьмя пробелами, эффективно добавив четыре пробела в начале строки.
(g делает это глобально, без него он будет делать это только один раз, что будет делать первая строка.)
Ответ 3
Вы можете отфильтровать вывод из команды, которую вы хотите отступать через 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.
Ответ 4
Другое решение, которое не требует sed:
command | (while read; do echo " $REPLY"; done)
Ответ 5
Так как решение awk еще не было опубликовано:
$ echo -en "hello\nworld\n"
hello
world
$ echo -en "hello\nworld\n" | awk '{print " "$0}'
hello
world