Bash-Befehlsersetzung funktioniert nicht wie erwartet

1377
Joe Fruchey

Ich möchte die letzten Zeilen einer Datei anzeigen, aber ich möchte, dass die Spalten ausgerichtet werden. Grundsätzlich möchte ich Wordwrap deaktivieren.

Dies ist unkompliziert mit:

tail $FILE | cut -c -80 

Ich versuche jedoch, mein Skript für andere Benutzer zu verallgemeinern, und ich möchte auf die tatsächliche Klemmenbreite schneiden, die ich mit bekommen kann:

stty size | cut -d" " -f2 

Also ich könnte mir vorstellen, dass ich das eben könnte

tail $FILE | cut -c -`stty size | cut -d" " -f2` 

aber es funktioniert nicht:

stty: standard input: Invalid argument cut: invalid range with no endpoint: - Try `cut --help' for more information. 

(Gleiche Ergebnisse mit der 'neuen' $ () - Erweiterung.)

Nun, wenn ich es wiederhole, scheint es in Ordnung zu sein:

echo cut -c -`stty size | cut -d" " -f2` cut -c -103 

Verpasse ich nur ein Escape-Zeichen? Oder ist das irgendwie einfach nicht möglich?

Vielen Dank.

4

2 Antworten auf die Frage

3
Jaap Eldering

Der Grund dafür ist, dass es nicht funktioniert, weil sttyes innerhalb einer Pipe ausgeführt wird. Daher "sieht" er das darunterliegende Terminal nicht. In Ihrem Skript könnten Sie die Klemmenbreite in einer Variablen wie speichern

size=`stty size | cut -d" " -f2` 

und dann das nächste:

tail $FILE | cut -c -$size 
1
Bradd Szonye

Bash behält die Bildschirmbreite in der COLUMNSVariablen bei, die Sie in einer Pipeline verwenden können:

tail $FILE | cut -c -$COLUMNS