Wie mache ich Bash, um die Ausgabe nicht zu beenden?

32

Immer wenn ein Befehl lange Zeilen als Ausgabe generiert (z. B. wenn ls -lein Ordner Dateien mit langen Namen enthält), werden die langen Zeilen in die nächste Zeile umgebrochen, wodurch die Spaltenstruktur durcheinander gebracht wird.

Gibt es eine Möglichkeit, dies zu vermeiden? Etwas ähnlich der Option "nowrap" vim?


aktualisieren

Ich habe ein Problem mit der akzeptierten Antwort festgestellt:
Wenn ich einen Alias ​​wie ":" mache alias ll="tput rmam; ls -l; tput smam"
und dann versuche, die Ausgabe von "grep" zu überprüfen: ll | grep foo
Es werden weiterhin alle Dateien gedruckt , z. B. ohne "grep".

Die Lösung, die ich gefunden habe, besteht darin, den gesamten Alias ​​in Klammern zu setzen:
alias ll="(tput rmam; ls -l; tput smam)"

Mihai Rotaru
quelle
related unix.stackexchange.com/questions/20493/…
Ciro Santilli Mitglied seit 996ICU von

Antworten:

26

Beachten Sie, dass dies nichts mit Bash zu tun hat (sobald Sie den Befehl gestartet haben, wartet Bash nur darauf, dass er beendet wird) und mit allem, was mit dem Terminal zu tun hat.

Die meisten Terminalemulatoren werden standardmäßig am rechten Rand umbrochen. Dies kann jedoch mithilfe der entsprechenden Steuersequenz deaktiviert werden , wenn der Terminalemulator dies unterstützt. dann werden lange Zeilen einfach abgeschnitten:

printf '\033[?7l'
ls -l /a/folder/that/contains/files/with/long/names
printf '\033[?7h'
Gilles
quelle
Ja, das ist es, wonach ich gesucht habe, danke Gilles!
Mihai Rotaru
12
Portabler:tput rmam; ls -l longname; tput smam
Dennis Williamson
noch besser; aber woher kam meine Mutter? Ich habe tput- und termcap-Handbücher durchsucht, aber nichts darüber gefunden?
Mihai Rotaru
2
@Mihai: probiere die terminfo Dokumentation ( man 5 terminfounter Linux).
Gilles
in der Tat ist es da
Mihai Rotaru
17

Wenn Sie horizontal scrollen möchten, anstatt die Zeilen abzuschneiden, verwenden Sie less -S.

Dennis Williamson
quelle
5

Sie könnten eine Funktion wie folgt verwenden:

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

Denken Sie jedoch daran, dass Sie den Befehlen einen Präfix nowrapoder einen beliebigen Namen für die Funktion voranstellen müssen.

John T
quelle
es funktioniert, aber ich verliere die Farbcodierung; Wie kann man das auch bewahren?
Mihai Rotaru
3

Hier ist der .bash_profileAlias, mit dem ich den Zeilenumbruch beim grepPingen automatisch deaktiviere :

alias grep='tput rmam; { sleep 20 && tput smam & }; grep'

tput rmam Deaktiviert das Umschließen.

{ sleep 20 && tput smam & }wird die Verpackung in 20 Sekunden reaktivieren. Das &am Ende lässt es im Hintergrund laufen, damit grepes in der Zwischenzeit funktionieren kann. Sie müssen die Umhüllung erneut aktivieren, da sie sich nicht auf Ihr Terminal auswirkt. In meinem Fall haben sich tput rmamBefehle, die länger als die Terminalbreite sind, überschrieben, anstatt in eine neue Zeile zu springen (sehr ärgerlich).

Und dann grepmacht es seine Magie, ohne Verpackung! Wenn die Ausführung jedoch länger als 20 Sekunden dauert, wird die Umhüllung schnell wiederhergestellt, sodass Sie sie je nach System möglicherweise länger einstellen möchten.


BEARBEITEN:

Ein noch besserer Ansatz ist die Verwendung einer Funktion, die automatisch tput rmamvor und tput smamnach Ihrem grep ausgeführt wird :

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

Geben Sie das in Ihr .bash_profileund wann immer Sie rennen grp, greift es ohne Zeilenumbruch.

ognockocaten
quelle
The sleep 20is amazing :-)
Ciro Santilli am
2

Pipe es zu weniger Befehl mit -S Schalter:

ls -l | less -S

Dann können Sie mit den Pfeilen nach oben / unten / links / rechts scrollen und zum Beenden q eingeben.

qartal
quelle
1

Versuche dies

function nowrap { export COLS=`tput cols` ; cut -c-$COLS ; unset COLS ; echo -ne "\e[0m" ; }
drigoSkalWalker
quelle
Entschuldigung für die Goldschaufel
drigoSkalWalker