jak zrobić bash, aby nie zawijał danych wyjściowych?

33

Ilekroć jakieś polecenie generuje długie wiersze jako dane wyjściowe (na przykład, gdy ls -lfolder zawierający pliki o długich nazwach), długie wiersze są zawijane do następnego wiersza, co psuje strukturę kolumny.

Czy jest jakiś sposób na uniknięcie tego? Coś podobnego do opcji vim „nowrap”?


aktualizacja

Zauważyłem problem z zaakceptowaną odpowiedzią:
jeśli utworzę alias typu: alias ll="tput rmam; ls -l; tput smam"
a następnie spróbuję grepować jego wynik: ll | grep foo
nadal będzie drukować wszystkie pliki, tak jak bez grep.

Rozwiązaniem, które znalazłem, jest umieszczenie nawiasów wokół całego aliasu:
alias ll="(tput rmam; ls -l; tput smam)"

Mihai Rotaru
źródło
powiązane unix.stackexchange.com/questions/20493/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
powiązane superuser.com/q/600677/105108
ks1322

Odpowiedzi:

27

Zauważ, że nie ma to nic wspólnego z bash (po uruchomieniu polecenia, bash po prostu czeka, aż się skończy) i wszystko, co ma związek z terminalem.

Większość emulatorów terminali jest domyślnie zawijanych na prawym marginesie. Ale można to wyłączyć za pomocą odpowiedniej sekwencji kontrolnej , jeśli emulator terminala ją obsługuje; wtedy długie linie są po prostu obcinane:

printf '\033[?7l'
ls -l /a/folder/that/contains/files/with/long/names
printf '\033[?7h'
Gilles „SO- przestań być zły”
źródło
tak, tego właśnie szukałem, dzięki Gilles!
Mihai Rotaru,
12
Bardziej przenośne:tput rmam; ls -l longname; tput smam
Wstrzymano do odwołania.
nawet lepiej; ale skąd się wzięła mama? Przeszukałem podręczniki tput i termcap, ale nie znalazłem nic na ich temat?
Mihai Rotaru,
2
@Mihai: wypróbuj dokumentację terminfo ( man 5 terminfow systemie Linux).
Gilles „SO- przestań być zły”
rzeczywiście tam jest
Mihai Rotaru
17

Jeśli chcesz, aby móc zrobić przewijania w poziomie zamiast obcinania wierszami, wykorzystanie less -S.

Wstrzymano do odwołania.
źródło
5

Możesz użyć takiej funkcji:

nowrap() 
{ 
   cut -c-$(tput cols); 
}

pamiętaj jednak, że będziesz musiał poprzedzać polecenia nowrapfunkcją lub jakkolwiek nazwiesz tę funkcję.

John T.
źródło
to działa, ale tracę kodowanie kolorów; jakikolwiek sposób na zachowanie tego?
Mihai Rotaru,
3

Możesz zastąpić funkcję, aby automatycznie działała tput rmamprzed grepem i tput smampo:

function grep () {
  tput rmam;
  command grep "$@";
  tput smam;
}

Upuść to w swoim .bash_profilei za każdym razem, gdy uruchomisz grep, będzie grep bez zawijania linii.

Zostało to mocno zredagowane, przepraszam komentatorów.

ognockocaten
źródło
To sleep 20jest niesamowite :-)
Ciro Santilli 事件 改造 中心 法轮功 六四 事件
2

potokuj do mniej polecenia za pomocą przełącznika -S:

ls -l | less -S

Następnie możesz użyć strzałek w górę / w dół / w lewo / w prawo, aby przewinąć i wpisać q, aby wyjść.

qartal
źródło
1

Spróbuj tego

function nowrap { export COLS=`tput cols` ; cut -c-$COLS ; unset COLS ; echo -ne "\e[0m" ; }
drigoSkalWalker
źródło
przepraszam za złotą łopatę
drigoSkalWalker 11.01.13