Как вставить вкладки перед строками вывода из выполненной команды

16

Просто быстрый вопрос. Можно ли вкладывать вывод на Ubuntu 16.04 LTS? Я создал два изображения ниже, чтобы попытаться проиллюстрировать, что я имею в виду под этим.

img1

img2

Алекс Нг
источник
1
Было бы хорошо, если бы вам пришлось передавать вывод команды через другую команду, например, YOUR COMMAND | indentили если вам нужно было набрать другую команду перед ней (может быть только подчеркивание), как _ YOUR COMMAND?
Byte Commander
1
@ByteCommander Я учел это, однако я делаю это для простоты использования и облегчения чтения выходных данных консоли. Поэтому я не думаю, что решение всех моих команд - это решение. Спасибо за ответ и редактировать, хотя!
Алекс Нг
1
[Пожалуйста, не публикуйте текстовые сообщения. ] ( meta.askubuntu.com/q/8713/85695 )
тердон

Ответы:

15

Вы можете сделать что-то вроде этого - с файловыми дескрипторами:

  1. сохранить текущий дескриптор вывода, чтобы мы могли восстановить его позже

    exec 3>&1
  2. перенаправить поток вывода на подстановку процесса, которая вставляет вкладку - например,

    exec 1> >(paste /dev/null -)

С этого момента любой процесс, который пишет в стандартный вывод, будет иметь этот фильтр, «отфильтрованный» через pasteкоманду для вставки вкладок в начале.

  1. Когда вы закончите, вы можете возобновить нормальное поведение, восстановив дескриптор сохраненного файла и закрыв временный дескриптор.

    exec 1>&3 3>&-
steeldriver
источник
Я хотел бы поблагодарить вас за ответ. Это самое близкое решение, которое я нашел, хотя оно и не идеально.
Алекс Нг
@AlexNg спасибо за отзыв - каким образом он не выполняет то, что вы просили? если вы дадите мне знать, я постараюсь улучшить его
Steeldriver
Чтобы привести несколько примеров: После ввода ваших команд некоторые команды работают как задумано, например, 'php -v', 'hostname' и другие. Однако при использовании такой команды, как «echo Hello World», выходные данные отображаются в строке вместе с входными данными, что также отрицательно влияет на внешний вид входных данных при вводе следующей команды. Некоторые другие команды также не влияют на процесс табуляции, например, при вводе недопустимой команды, такой как «asdasd».
Алекс Нг
Наконец, он не отображает корректно выводимые данные (не уверен, как правильно это описать, извинения). Например, если используется команда «apt-get update», есть заметные различия при сравнении ее с консолью без процесса табуляции.
Алекс Нг
Проблема состоит в том, что этот подход обрабатывает только STDOUT (поток 1), но не STDERR (поток 2). Он также разрыв вывода программ , которые используют lessили аналогичные инструменты , чтобы скроллинг выхода, как , например man.
Byte Commander
9

Я понимаю, что этот ответ не является оптимальным для вас, но вы можете создать функцию Bash с простым именем _(или что-то еще, что еще не используется), которая запускает команду, которую она получает в качестве аргументов, и делает отступ для всего ее вывода вкладкой.

Пример:

$ _ lsb_release -a
        No LSB modules are available.
        Distributor ID: Ubuntu
        Description:    Ubuntu 16.04 LTS
        Release:    16.04
        Codename:   xenial

Код этой функции будет следующим:

_(){ sed "s/^/\t/" <($*); }

Вы можете добавить его в свой ~/.bashrcфайл, чтобы он был доступен во всех сеансах Bash вашего пользователя, выполнив:

echo '_(){ sed "s/^/\t/" <($*); }' >> ~/.bashrc

Если вы хотите сделать его доступным для всех пользователей, добавьте его /etc/bash.bashrcвместо (требуются права администратора):

echo '_(){ sed "s/^/\t/" <($*); }' | sudo tee -a /etc/bash.bashrc

В качестве альтернативы вы можете также создать файл сценария, например, /usr/local/bin/_со следующим содержимым, чтобы добиться того же самого без функций Bash и для всех пользователей:

#!/bin/bash
sed "s/^/\t/" <($*)

Вы должны сделать сценарий исполняемым после сохранения файла, используя

sudo chmod +x /usr/local/bin/_
Byte Commander
источник
5

В echoчастности, вы можете интерпретировать обратную косую черту как \t( табуляция ) с помощью -eпереключателя:

echo -e "\tHello World"

Но вряд ли возможно (или, возможно, возможно) изменить вывод каждой команды таким образом. Если ваша цель - облегчить чтение, вы можете захотеть настроить внешний вид (например, цвет) командной строки, как показано здесь:

Вы можете настроить приглашение, изменив содержимое переменной среды PS1. Вы можете увидеть небольшой пример того, как это сделать, в сообщении блога, с которого сделан скриншот выше. Как подробно использовать эти так называемые escape-последовательности ANSI, как использовать более удобные инструменты, как применять изменения по умолчанию в новых терминалах и т. Д., Выходит за рамки этого ответа. Но если вы решите использовать эту технику, в Интернете есть множество учебных пособий и дополнительной информации.

Хеннинг Кокербек
источник
Спасибо за ответ, однако я уже сменил PS1 на свой вкус.
Алекс Нг