Jak wstawiać tabulatory przed wierszami wyjściowymi z wykonanego polecenia

16

Krótkie pytanie. Czy możliwe jest utworzenie zakładki danych wyjściowych w systemie Ubuntu 16.04 LTS? Utworzyłem dwa zdjęcia poniżej, aby zilustrować, co mam na myśli.

img1

img2

Alex Ng
źródło
1
Czy byłoby dobrze, gdybyś musiał przesyłać dane wyjściowe polecenia przez inne polecenie, takie jak YOUR COMMAND | indentlub jeśli musisz wpisać inne polecenie przed nim (może to być tylko podkreślenie), takie jak _ YOUR COMMAND?
Bajt Dowódca
1
@ByteCommander Rozważyłem to, jednak robię to dla łatwości użytkowania i aby ułatwić odczytanie danych wyjściowych konsoli. Więc nie sądzę, że wypuszczenie wszystkich moich poleceń jest rozwiązaniem. Dziękuję za odpowiedź i edytuj!
Alex Ng
1
[Proszę nie publikować zrzutów tekstu wyjściowego. ] ( meta.askubuntu.com/q/8713/85695 )
terdon

Odpowiedzi:

15

Możesz zrobić coś takiego - z deskryptorami plików:

  1. zapisz bieżący deskryptor wyjściowy, abyśmy mogli go później przywrócić

    exec 3>&1
  2. przekieruj strumień wyjściowy do podstawienia procesu, który wstawia kartę - na przykład

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

Od tego momentu każdy proces, który zapisuje na standardowe wyjście, będzie filtrował dane wyjściowe za pomocą pastepolecenia wstawiania tabulatorów na początku.

  1. Po zakończeniu możesz przywrócić normalne zachowanie, przywracając zapisany deskryptor pliku i zamykając tymczasowy

    exec 1>&3 3>&-
steeldriver
źródło
Chciałbym podziękować za odpowiedź. To jest najbliższe mi rozwiązanie, mimo że nie jest idealne.
Alex Ng
@AlexNg dzięki za głosowanie - w jaki konkretny sposób nie robi tego, o co prosiłeś? jeśli
dacie
Podam kilka przykładów: Po wprowadzeniu poleceń niektóre polecenia działają zgodnie z przeznaczeniem, takie jak „php -v”, „nazwa hosta” i inne. Jednak podczas korzystania z polecenia, takiego jak „echo Hello World”, dane wyjściowe są wyświetlane w linii z danymi wejściowymi, a także niekorzystnie wpływają na wygląd wizualny danych wejściowych podczas wprowadzania następnego polecenia. Niektóre tabulacje również nie wpływają na proces tabulacji, na przykład podczas wprowadzania nieprawidłowej komendy, takiej jak „asdasd”.
Alex Ng
Wreszcie, nie wyświetla poprawnie zmieniających się wyników (nie jestem pewien, jak to właściwie opisać, przepraszam). Na przykład, jeśli użyto polecenia „apt-get update”, zauważalne są różnice w porównaniu z konsolą bez procesu tabulacji.
Alex Ng
Problem polega na tym, że takie podejście obsługuje tylko STDOUT (strumień 1), ale nie STDERR (strumień 2). Uszkadza również wyjście programów, które używają lesslub podobnych narzędzi, aby umożliwić przewijanie danych wyjściowych, takich jak np man.
Bajt Dowódca
9

Rozumiem, że ta odpowiedź nie jest dla ciebie optymalna, ale możesz utworzyć funkcję Bash o prostej nazwie _(lub cokolwiek, co nie jest jeszcze używane), która uruchamia komendę, którą otrzymuje jako argumenty i wcina wszystkie wyniki za pomocą tabulacji.

Przykład:

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

Kod tej funkcji będzie taki:

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

Możesz dołączyć go do swojego ~/.bashrcpliku, aby był dostępny we wszystkich sesjach Bash użytkownika, uruchamiając:

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

Jeśli chcesz udostępnić go wszystkim użytkownikom, dołącz go /etc/bash.bashrczamiast tego (wymaga uprawnień administratora):

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

Alternatywnie możesz również utworzyć plik skryptu /usr/local/bin/_z następującą zawartością, aby osiągnąć to samo bez funkcji Bash i dla wszystkich użytkowników:

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

Po zapisaniu pliku należy wykonać skrypt

sudo chmod +x /usr/local/bin/_
Bajt Dowódca
źródło
5

Za pomocą przełącznika echomożesz w szczególności interpretować zmiany ukośnika odwrotnego, takie jak \t( tabulator ) -e:

echo -e "\tHello World"

Ale modyfikacja wyniku każdego polecenia w ten sposób byłaby praktycznie niemożliwa (lub prawdopodobnie możliwa). Jeśli Twoim celem jest łatwość czytania, możesz spróbować dostosować wygląd (np. Kolorystykę) wiersza polecenia, jak pokazano poniżej:

Możesz dostosować monit, zmieniając zawartość zmiennej środowiskowej PS1. Możesz zobaczyć mały przykład tego, jak to zrobić w blogu, z którego pochodzi powyższy zrzut ekranu. Jak szczegółowo korzystać z tak zwanych sekwencji ucieczki ANSI, jak korzystać z wygodniejszych narzędzi, jak domyślnie stosować zmiany w nowych terminalach itp., Wykracza poza zakres tej odpowiedzi. Ale jeśli zdecydujesz się użyć tej techniki, w sieci jest wiele samouczków i innych informacji.

Henning Kockerbeck
źródło
Dziękuję za odpowiedź, jednak zmieniłem już PS1 według własnych upodobań.
Alex Ng