• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

bash:laufendes Programm einen "buchstaben" übergeb

Wurstbrot

Newbie
Ich möchte ein Programm beenden (ohne kill), z.b. bei man benutzt man q zum beenden, dies möchte ich in einem bash script tun.

Beispiel:
Code:
`man ls`
`sleep5`
`<stdin <taste "q">`
 

taki

Advanced Hacker
Wie wäre es denn mit...

Code:
man ls|cat

Dann braucht es kein quit.

Wirklich brauchbar ist die Ausgabe aber nicht, scrollt elends lang und Du siehst nur noch die letzten Zeilen. Mit...

Code:
man ls|head n

...könntest Du noch die Ausgabe auf n Zeilen vom Anfang beschränken. Etwas sinnfrei bleibt das aber immer noch.
 

sc_m

Member
Im Prinzip sollte ja so etwas funktionieren:
Code:
{ sleep 10; echo "q"; }|cat >kram
Die Datei "kram" wird gleich beim Aufruf angelegt, aber erst nach 10 Sekunden wird "q" hineingeschrieben. Dummerweise scheint sich "man" aber nicht um das "q" in STDIN zu kümmern. Es funktioniert dagegen
Code:
{ sleep 10; echo "q"; }|info bash
 
OP
W

Wurstbrot

Newbie
"man" war nur ein beispiel, ich möchte schon ein richtiges programm damit beenden.
Aber um bei dem Beispiel zu bleiben, ich müßte die "Pfeiltasten" ansprechen, um nach unten zu scrollen.
Ich möchte sozusagen den tastendruck <pfeil nach unten> simulieren.
Die idee mit echo ist gut, nur funktioniert leider in diesem fall nicht.
 

sc_m

Member
Mir ist aufgefallen, dass "info" auch nicht das macht, was gedacht war. Stattdessen scheint es bei einer beliebigen Eingabe abzubrechen.

Aber davon abgesehen kann echo auch Steuerzeichen ausgeben, siehe etwa
Code:
echo -e "Hier sind \e[5B vier Zeilen leer"
Google mal nach Bash Escape-Sequenzen.
 

styyxx

Member
Hi,

ich versteh glaub ich nicht so ganz was du möchtest.
Du möchtest also von außen z.B. die Pfeil-nach-unten-Taste simulieren und dieses dann dem Programm übergeben und dieses soll dann tatsächlich nach unten scrollen (obwohl du das dann gar nicht siehst)?!

Grüße
styyxx
 
OP
W

Wurstbrot

Newbie
Ich habe ein Konsolenbittorrend laufen, da ich niemals die ganze suse cd auf einmal ziehen könnte.
Dieser wird per "q"-taste beedendet.
Ich möchte das mein mitbewohner per script das teil starten (das ist kein prob) und beenden (das ist mein prob) kann.

Der schließt nach "q" immer noch die torrents und deswegen fällt für mich kill raus.

ps: hatte den Menü Punkt Konsole nicht gesehen, thx fürs verschieben.
 
A

Anonymous

Gast
Hi,
meinst du die read funktion ????
Code:
#!/bin/sh
while :
        do
        echo "etwas immer wieder machen"
        echo "beenden mit q"
        read -sn1 par
        if [ "$par" == "q" ]
                then
                exit
        fi
done

Mƒg ®êïñï
 
sc_m schrieb:
Im Prinzip sollte ja so etwas funktionieren:
Code:
{ sleep 10; echo "q"; }|cat >kram
Die Datei "kram" wird gleich beim Aufruf angelegt, aber erst nach 10 Sekunden wird "q" hineingeschrieben. Dummerweise scheint sich "man" aber nicht um das "q" in STDIN zu kümmern. Es funktioniert dagegen
Code:
{ sleep 10; echo "q"; }|info bash
Runde Klammern statt geschwiffene, dann bist du näher dran. Aber interaktive Programme wie info haben da meinst Probleme mit, weil die Daten schneller reinkommen als etwaige Dateien, auf die die per Pipe zugeschickten Befehle angewandt werden sollen, zur Verfügung stehen.
 

sc_m

Member
Was hast du gegen meine geschweiften Klammern?
Code:
> man bash
[...]
{ list; }
              list  is  simply  executed  in the current shell environment.  list must be terminated
              with a newline or semicolon.  This is known as a group command.  The return status  is
              the  exit  status  of  list.  Note that unlike the metacharacters ( and ), { and } are
              reserved words and must occur where a reserved word is  permitted  to  be  recognized.
              Since  they do not cause a word break, they must be separated from list by whitespace.
[...]
Der erste Befehl macht genau das, was ich geschrieben habe. Und auch im zweiten Fall wird das "q" doch wohl erst nach 10 Sekunden abgeschickt.
 
Ich vergaß. () macht angeblich ne Subshell, oder zumindest einen neuen Stack auf, während das {} nicht macht.
Code:
15:34 shanghai:~ > ( cd /; );
15:34 shanghai:~ > { cd /; };
15:34 shanghai:/ >
QED.

10 Sekunden? Das Problem ist, dass du das nicht genau bestimmen kannst! Wenn aus welchen Gründen auch immer (langsamer Programmstart, etc, etc, etc) zwischen Befehl1 und Befehl2 nicht exakt (also weniger) die Zeitspanne vergeht, die das Programm eigentlich braucht, kommst du wieder an den Anfang. Dann liest das Programm nach der Pipe nämlich beim ersten read-Syscall "bla; quit;" - gerade das, was man nicht möchte; man möchte, dass quit erst bei einem späteren syscall von STDIN gelesen wird.
 
A

Anonymous

Gast
Hallo zusammen,

ich habe da ein ähnliches Problem. Habe bis jetzt mit den Codefragmenten, die hier gepostet wurden mal rumgespielt.

Mein Vorhaben ist es mit w3m eine Site aufzurufen und dort dann automatisch die 'tab-Taste' und 'Return-Taste' auszuführen.

Wie kann ich dem Prozess(w3m) einen Tabulator-Tastendruck bzw. ein Returntastendruck-übermitteln.

Vielen Dank für eure Hilfe

Gruss

Silmarillion
 
A

Anonymous

Gast
jengelh schrieb:
Wenn es mit `echo -en "\t\n" | w3m ...` nicht geht, kannst du es ja mal mit `echo -en "\t\n" | pipe2pt w3m ...` (pipe2pt) versuchen.

Hallo jengelh,

vielen Dank für deinen Tip. Habe das hxtools-Paket installiert
und pipe2pt so eingebaut:
Code:
echo -en "\t" | /usr/lib/hxtools/supp/pipe2pt w3m www.google.de

eigentlich sollte "Personalisierte Startseite" markiert sein. Leider ist dem nicht so. Muss ich evtl. beachten, das mein im Tastaturpuffer"\t" verloren geht? Obvwohl ich mir das nicht bei Linux vorstellen kann.
Auch wenn ich es mit "a" versuche [erwartende Ergbenis -> Bookmarks werden angezeigt] klappt leider nicht.

Thx
 
Oben