Відступ багаторядкового виводу у сценарії оболонки


78

Я намагаюся змінити повідомлення дня (MOTD) на моєму вікні Ubuntu Amazon EC2, щоб воно відображало статус git одного з моїх каталогів, коли я SSH в.

Вихідні дані всіх файлів MOTD за замовчуванням мають два пробіли на початку кожного рядка, тому він виглядає красиво з відступами, але оскільки мій git statusвивід охоплює декілька рядків, якщо я це роблю echo -n " "раніше, він відступає лише перший рядок.

Будь-яка ідея, як я можу змусити його відступити кожен рядок?

Відповіді:


129

Проведіть його, щоб sedвставити по 2 пробіли на початку кожного рядка.

git status | sed 's/^/  /'

Я не уявляю, як це обійти, але з цим є невелика проблема. Код виходу функції руйнується, sedщо в деяких випадках може бути проблемою.
cglacet

@cglacet Це правда, коли ви передаєте одну команду іншій. Якщо це проблема, ви перенаправляєте висновок у файл або змінну, перевіряєте стан виходу, а потім обробляєте збережений результат.
Бармар

@cglacet Вказівка set -euo pipefailу другому рядку вашого сценарію перевірить його для вас.
Проникність

44

Спираючись на відповідь @ Barmar, це більш акуратний спосіб зробити це:

indent() { sed 's/^/  /'; }

git status | indent
other_command | indent

1
Насправді це мало що додає, це був одноразовий випадок всередині сценарію оболонки, і тому підпрограми bash трохи надмірні, але дякую
Метт Флетчер

3
@MattFletcher: Ну, я думаю, що написання коду з підпрограмами, подібно до цього, полегшує непрофесійному професору (як і мені) зрозуміти, що відбувається. Крім того, якщо ви вирішили, що раптом захотіли мати 3 замість 2 пробілів, у вас є лише одне місце для виправлення.
Верінг

3
@Vering, що це правда, і я розумію переваги такого, я просто більше припускав, що це міг бути коментарем, а не самою відповіддю, оскільки це майже однакова відповідь і стосується проблеми, яка ніколи не піднімалась у перше місце :)
Метт Флетчер

@MattFletcher: Гаразд, можливо, у вас є зауваження щодо коментарів та відповідей
Веринг,

3
Майте на увазі, я надавав альтернативний фрагмент коду. Це не ідеально зображати в коментарі без форматування коду. Якби я просто давав речення чи два коментарі щодо існуючої відповіді, це було б більш доречним на мій погляд як коментар.
Marplesoft

10

Завдяки @Barmar та @Marplesoft за кілька приємних простих рішень - ось ще одна варіація, яка може сподобатися іншим - функція, за допомогою якої ви можете визначити, скільки рівнів відступу pr:

indent() {
  local indentSize=2
  local indent=1
  if [ -n "$1" ]; then indent=$1; fi
  pr -to $(($indent * $indentSize))
}

# Example usage
ls -al | indent
git status | indent 2

2
Хороша відповідь. FWIW, '$' є непотрібним всередині ((...)). Дивіться github.com/koalaman/shellcheck/wiki/SC2004
jblaine

чи можна взагалі зробити цю роботу з кольоровими екранами Bash?
Санки

@Sled У разі lsви можете використовувати --color=alwaysопцію: ls -al --color=always | indent. Джерело: цей потік StackExchange
Archangel1C
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.