wxpte
Anmeldungsdatum: 20. Januar 2007
Beiträge: 1140
Wohnort: Schäl Sick
|
Hallo Community, hin und wieder kommt es vor, dass man für den Befehl cut keinen passenden Field Separator findet, und daher auf die Option -c angewiesen ist. In der Anleitung zum Befehl ist es so dargestellt, als sei mit einem kurzen Blick auf den Bildschirm sofort klar, wo sich der auszuschneidende Bereich der Zeile befindet. Da das bei mir nicht der Fall ist, und ich auch nicht jedesmal herumprobieren will, habe ich folgendes, lineal.sh genanntes, Miniskript verfasst:
| #!/bin/bash
clear
if [ -z "$1" ]
then
echo 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567
echo " 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5"
else
echo 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567 | cut -c-$1
echo " 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5" | cut -c-$1
fi
|
Durch Aufruf von
lineal.sh 130; Befehl-zum-Anzeigen-der-Zeile
kann ich nun auf einen Blick erkennen, wo sich der auszuschneidende Bereich befindet. Da ich aber annehme, dass ich längst nicht der Erste bin, dem es so ergeht, nun meine Frage: Gibt es eventuell schon eine ähnliche Funktion, die direkt in die Shell integriert ist, so dass das Skript eigentlich nicht erforderlich wäre?
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
WinXP to Edgy schrieb:
Gibt es eventuell schon eine ähnliche Funktion, die direkt in die Shell integriert ist, so dass das Skript eigentlich nicht erforderlich wäre?
Nicht, dass ich wüsste. Du könntest es Dir vielleicht noch etwas einfacher machen: #vorlage Befehl
$ for ((i=0;i<10;++i)); do echo -n '1234567890'; done; echo ''; for ((i=1;i<=10;++i)); do printf '%10d' $i; done; echo ''
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
1 2 3 4 5 6 7 8 9 10 ☺ Mit etwas mehr Aufwand, kannst Du noch die Breite des Terminals einfließen lassen und den Balken entsprechend breit machen. Ciao robert
|
wxpte
(Themenstarter)
Anmeldungsdatum: 20. Januar 2007
Beiträge: 1140
Wohnort: Schäl Sick
|
rklm schrieb:
Du könntest es Dir vielleicht noch etwas einfacher machen:
Wenn das Skript einmal geschrieben ist, ist es von der Anwendung her sicher kein Unterschied. Aber für andere Aufgaben ist dein Vorschlag sehr interessant. Die mir noch aus BASIC-Zeiten bekannte hochzählende for-Schleife hatte ich unter der Shell nämlich schon ein wenig vermisst und bin deswegen auf die while-Schleife ausgewichen. Dabei bedeutet ++i wohl, dass die Variable um eins hochzählt. Geht das auch in größeren Stufen, also nach Art von i=$((i+5)) ? rklm schrieb:
Mit etwas mehr Aufwand, kannst Du noch die Breite des Terminals einfließen lassen und den Balken entsprechend breit machen.
Gibt es denn eine Möglichkeit, die Breite des Terminals aus einer Systemvariablen auszulesen? Wie du sicher schon gesehen hast, mache ich das bis jetzt über einen Parameter. Auf jeden Fall schon einmal: danke für den Tipp. 👍
|
TNTMaster
Anmeldungsdatum: 30. Juli 2009
Beiträge: 851
|
Dabei bedeutet ++i wohl, dass die Variable um eins hochzählt. Geht das auch in größeren Stufen
Genau, immer um 1, wenn es 5 sein sollen, dann kannst du das so schreiben:
i+=5 Gibt es denn eine Möglichkeit, die Breite des Terminals aus einer Systemvariablen auszulesen?
Ich war mal so unverschämt und habe von hier den Befehl zu Auslesen geklaut und die Befehle aus diesem Thread etwas angepaßt: Das Lineal hat die Breite des Terminals, wenn diese nicht anders angegeben wird.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | #!/bin/bash
if [ -z "$1" ]; then
breite=$(stty -a | sed -ne 's#^.*columns *\([0-9]\+\).*$#\1#p')
else
breite=$1
fi
for ((i=1;i<breite+1;++i)); do
# gibt die letzte Ziffer von $i aus
echo -n $((i%10))
done
echo
for ((i=1;i<=breite/10;++i)); do
printf '%10d' $i
done
echo
|
TNT
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
Ich hätte noch diese sparsame Version anzubieten:
| echo {02..99..3}
02 05 08 11 14 17 20 23 26 29 32 35 38 41 44 47 50 53 56 59 62 65 68 71 74 77 80 83 86 89 92 95 98
|
Die rechte Ziffer ist immer maßgeblich für den Wert. Statt TNTMasters stty-Gymnastik empfehle ich auch
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
user unknown schrieb:
Statt TNTMasters stty-Gymnastik empfehle ich auch
Das funktioniert nur nach meiner Erfahrung nicht überall. 😬
|
wxpte
(Themenstarter)
Anmeldungsdatum: 20. Januar 2007
Beiträge: 1140
Wohnort: Schäl Sick
|
Das sind ja eine ganze Menge guter Anregungen. ☺ Die automatische Anpassung des Lineals an die Terminalbreite habe ich jetzt auch erfolgreich ausprobliert. Nochmals, vielen Dank an alle.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
rklm schrieb: user unknown schrieb:
Statt TNTMasters stty-Gymnastik empfehle ich auch
Das funktioniert nur nach meiner Erfahrung nicht überall. 😬
Nicht in McPomm, auf Solaris-Systemen, in Dash-Shells, unter Widows 7 oder wo nicht? 😉
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
user unknown schrieb: rklm schrieb:
Das funktioniert nur nach meiner Erfahrung nicht überall. 😬
Nicht in McPomm, auf Solaris-Systemen, in Dash-Shells, unter Widows 7 oder wo nicht? 😉
| $ uname -a
CYGWIN_NT-6.1 arnie 1.7.32(0.274/5/3) 2014-08-13 23:06 x86_64 Cygwin
$ echo $COLUMNS
$
|
Auch in einem xfce4-terminal mit dash ist die Variable nicht definiert. Andere Nicht-Ubuntu-Systeme habe ich gerade nicht zum Testen da. Selbst, wenn die Umgebungsvariable im Terminal gesetzt ist, kann man natürlich nicht davon ausgehen, dass der Wert immer erhalten bleibt oder korrekt ist, weil diese Variablen im Prinzip beliebig modifizierbar sind. Der Ansatz mit stty hat den Vorteil, dass er den Wert vom Terminal ermittelt, und er somit im Moment des Abrufs immer korrekt ist.
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Eine recht übersichtliche Lösung gäbe es dabei, wenn man grep mit Perl-Option und lookbehind benutzt: (vgl. auch hier) breite=$( stty -a | grep -oP '(?<=columns )[0-9]*' ) LG, track
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12801
|
track schrieb: Eine recht übersichtliche Lösung gäbe es dabei, wenn man grep mit Perl-Option und lookbehind benutzt:
Oh, ich wusste gar nicht, dass grep auch lookaround kann. Merci! 👍
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
rklm schrieb: user unknown schrieb: rklm schrieb:
Das funktioniert nur nach meiner Erfahrung nicht überall. 😬
Nicht in McPomm, auf Solaris-Systemen, in Dash-Shells, unter Widows 7 oder wo nicht? 😉
| $ uname -a
CYGWIN_NT-6.1 arnie 1.7.32(0.274/5/3) 2014-08-13 23:06 x86_64 Cygwin
$ echo $COLUMNS
$
|
Cygwin ist doch ein Windowsprogramm. Da kann man das Terminalfenster ohnehin nur begrenzt verbreitern.
Auch in einem xfce4-terminal mit dash ist die Variable nicht definiert. Andere Nicht-Ubuntu-Systeme habe ich gerade nicht zum Testen da.
In der Frage war der Shebnang von WinXP to Edgy /bin/bash, nicht /x/dash. Bei Ruby oder python funktioniert $COLUMNS auch nicht. Es gibt eben gute Gründe die Bash zu verwenden, gerade im interaktiven Modus. ☺
Selbst, wenn die Umgebungsvariable im Terminal gesetzt ist, kann man natürlich nicht davon ausgehen, dass der Wert immer erhalten bleibt oder korrekt ist, weil diese Variablen im Prinzip beliebig modifizierbar sind.
Tja - wenn man einen Löffel anspitzt kann man sich damit ein Auge ausstechen - wir sind überrascht und werfen alle Löffel weg!
Der Ansatz mit stty hat den Vorteil, dass er den Wert vom Terminal ermittelt, und er somit im Moment des Abrufs immer korrekt ist.
Das ist falsch. In TNTMasters Skript wird in Zeile 4 ermittelt und in den Zeilen 8 und 13 verwendet, d.h. es ist eine Race Condition und kann sehr wohl falsch sein. Löse ich mein xfce4-Term aus dem Vollbildmodus und starte dieses Programm:
| for n in {1..10}; do echo $COLUMNS; sleep .2 ; done
89
89
89
89
89
89
126
126
126
126
|
dann ändert sich die Anzeige, nachdem ich wieder auf Vollbild umschalte. Ich sehe da also wenig Grund mir mehr Sorgen zu machen.
|
TNTMaster
Anmeldungsdatum: 30. Juli 2009
Beiträge: 851
|
rklm schrieb: user unknown schrieb:
Statt TNTMasters stty-Gymnastik empfehle ich auch
Das funktioniert nur nach meiner Erfahrung nicht überall. 😬
Da muß ich rklm Recht geben, ich habe das im Gnome-Terminal getestet, dort ist $COLUMNS belegt, im Skript dagegen nicht. 😢
|
g00d.morning
Anmeldungsdatum: 20. Februar 2013
Beiträge: 330
|
TNTMaster schrieb: Da muß ich rklm Recht geben, ich habe das im Gnome-Terminal getestet, dort ist $COLUMNS belegt, im Skript dagegen nicht. 😢
Ja, eben. Bliebe aber immer noch $COLUMNS und $LINES als Argument zu übergeben. 😉
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17548
Wohnort: Berlin
|
TNTMaster schrieb: Das funktioniert nur nach meiner Erfahrung nicht überall. 😬
Da muß ich rklm Recht geben, ich habe das im Gnome-Terminal getestet, dort ist $COLUMNS belegt, im Skript dagegen nicht. 😢
Du meinst, wenn kein Fenster da ist, dann kann man nicht die Breite bestimmen? Das ist ja spukhaft! Wie kommt sowas? 😉 Wenn niemand hinkuckt, dann sieht auch niemand den Output. Wenn Du den in eine Datei umlenkst, dann weiß das Programm auch nicht, mit welchem Editor/Font Du das an welchem Monitor anschaust. Das interaktive Laufen kann man aber testen (Du weißt jetzt wie) und selbst einen Defaultwert dem User aufzwingen. Ein Skript kann man übrigens im Terminal laufen lassen - dann zeigt es auch die COLUMNS an, behaupte ich.
|