Weiss jemand wie ich bei Ubuntu die enter Taste an einen Terminal weiterleiten kann?

5 Antworten

Du hättest gleich sagen können, daß es dir um die Synchronisation von Prozessen geht ... dann wären wir schneller am Ziel ;-)

Soweit ich verstanden habe, willst du voneinander abhängige Scripte laufen lassen

Mit einem sleep x bist du da - denke ich - auf einem ungünstigen Pfad!

Es vergehen doch unnötig Zeiten (großer Wert für 'x' oder die darauf wartenden Prozesse werden zu oft aufgerufen: zu kleiner Wert für 'x').

Mach dich mal schlau zu semaphoren, signaling, ...

z.B. mit

apropos signal
apropos kill

In welcher Sprache sind deine Prozesse geschrieben? Falls C schau auch mal nach unter

man signal

Wenn du magst, kannst du eventuell über das proc-directory synchronisieren, aber das ist vielleicht doch nicht so optimal, da m.W. ein einfacher User dort nur Lese-Zugriff hat.

Schwierig wird es u.U. mit der Auswahl eines geeigneten Ortes, möglich wäre vielleicht (aber ohne Garantie):

cat /proc/cmdline

zum Lesen, und

echo Wert > /proc/cmdline

zum Schreiben.

Aber wie gesagt, ist das ein sehr grober Ansatz! Und ich wäre mir nicht sicher, wie oft in einem laufenden System auf diesen Zweig zugegriffen wird.

Ganz abgesehen davon wäre das auch nicht effektiver als sleep x, ist das doch wenigstens kein busy-waiting

Woher ich das weiß:eigene Erfahrung – Intensive Beschäftigung hiermit seit etlichen Jahren

ka111 
Beitragsersteller
 27.05.2014, 19:09

ok, danke. ich schaus mir morgen mal an, hab zu viel im kopf

0

Per copy&paste geht es zumindest. Wenn du z.B. in einen Texteditor in eine Zeile ls schreibst und dann Enter für einen Zeilenumbruch drückst und die zwei Zeilen dann mit der Maus markierst und mit der mittleren Maustaste ins Terminal einfügst, wird der Befehl (in diesem Fall das Anzeigen des Verzeichnisinhalts) direkt ausgeführt. Das liegt daran, dass das nicht sichtbare Zeichen für den Zeilenumbruch mit eingefügt wird. In Hex ist das 0A... Ob du damit jetzt aber etwas anfangen kannst bei dem was du machen willst, kann ich dir auch nicht sagen ;).


ka111 
Beitragsersteller
 27.05.2014, 12:50

hehe, das hab ich echt vergessen, und es geht sogar irgendwie, aber hat dann einfach nur einen absatz (oder leerzeile?), und wird nicht als enter gewertet

0

mit dem Umlenkung ( > ) auf eine anderes Terminal wird die Zeichenkette direkt auf das Terminal geschrieben. Du willst diese Zeichenkette aber der dort aktiven Shell übergeben und ausführen lassen. Mit der Enter-Taste hat das nichts zu tun. Von der Möglichkeit, einen Befehl habe ich noch nicht gehört. (In Tcl/Tk kann man mit send in einer anderen Anwendung Befehle laufen lassen. )

Du kannst aber den Befehl durch deine Shell ausführen lassen und das Ergebnis auf einem anderen Terminal darstellen. z.B.

ls -l > /dev/pts/3

oder aber auch

ls -l | write <user> pts/3 
Woher ich das weiß:Berufserfahrung – openSuSE seit 1995

ka111 
Beitragsersteller
 27.05.2014, 13:29

ich komme langsam nich mehr draus XD ich wollte eigentlich hauptsächlich nur sleep 3s && befehl an einen anderen terminal auf dem selben rechner weiterleiten. aber egal was ich mache auch mit all diesen beispielen hier wartet es immer selbst 3s auf dem terminal vondem ich eigentlich weiterleiten wollte, und nicht bei dem das eigentlich ankommen sollte. wieso?? wie kann ich sleep 3s an einen anderen terminal weiterleiten? Ps: ich war am wochenende nicht zu hause, und am montag erst am abend wieder da, und die beispiele muss ich auch noch ausprobieren und verstehen, ich hab von Linux nicht so ahnung und kann nur ein paar einfache befehle

0
ka111 
Beitragsersteller
 27.05.2014, 13:33
@ka111

und ich seh nie wann noch jemand irgendwo ein kommentar hinzugefügt hat zwischen all den anderen kommentaren und allem sonnstigen zeug das da so steht

0
guenterhalt  27.05.2014, 13:58
@ka111

das was du herausgefunden hast nur dein Terminal wartet auf das Ende des sleep-Befehls, ist ganz richtig. Was du da auch auf ein anders Terminal umleitest, das wird höchstens auf dem Bildschirm angezeigt, nicht aber der dort laufenden Shell übergeben.

Man kann keinen Befehl in einem anderen Terminal ausführen, auch wenn es mit der Umlenkung so aussieht. Das sind nur die Reports, die auf das Terminal umgeleitet werden.

Um eine Befehl auszuführen, kannst du den gewünschten Befehl ( auch durch Umlenkung) in eine Datei (auch gleich ein ausführbares Script) schreiben und im anderen Terminal ein Programm laufen lassen, dass ständig nach so einem Script sucht, es bei Vorhandensein ausführt und löscht und dann weiter sucht bis wieder so eine Datei vorhanden ist.

Das Beste dürfte sein, deine Aufgabe mal richtig zu beschreiben und nicht nur eine Idee für ein Detail zu beschreiben.

0
ka111 
Beitragsersteller
 27.05.2014, 14:46
@guenterhalt

ahaa, darum geht date, weil es den befehl eigentlich gar nicht im anderen terminal ausführt sonder nur die ausgabe weiterleitet :o . ich muss mal schnell einkaufen und paar sachen erledigen und schreibe nachher mal hier genau was ich machen wollte (in ca 1h)

0
ka111 
Beitragsersteller
 27.05.2014, 16:34
@ka111

ok. ich wollte den raspberry pi so programmieren dass er mit 2 motoren und 4 sensoren immer gerade aus fährt bis er an die wand kommt und ein sensor angiebt, dann soll er kurz zurück fahren, ein bisschen zur seite und wieder gerade aus weiter. wenn der sensor nicht betätigt ist steht in einer datei 1, wenn er betätigt wird 0. ich hab jetzt mal in etwa ein script geschrieben wenn er nur 1 sensor vorne hat (die anderen wären links und rechts und hinten, aber der wichtigste ist ja vorne):

!/bin/sh

while [ true ] ; do if [ $(cat /sys/class/gpio/gpio2/value) = "0" ]; then echo "0" > /sys/class/gpio/gpio3/value && echo "0" > /sys/class/gpio/gpio4/value && echo "1" > sys/class/gpio/gpio14/value && echo "1" > sys/class/gpio/gpio15/value && sleep 0.3 && echo "0" > sys/class/gpio/gpio14/value && sleep 0.3 && echo "0" > sys/class/gpio/gpio15/value && echo "1" > sys/class/gpio/gpio3/value && echo "1" > sys/class/gpio/gpio4/value fi done ich weiss nicht ob das funktioniert habs noch nicht auf dem raspberry pi, da ich noch keine räder daran gebaut habe. wenn bei gpio3 und gpio4 1 steht würden 2 motoren links und recht laufen - der pi fährt gerade aus. wenn gpio14 und gpio15 aktiviert sind und gpio3 und gpio4 nicht würde er rückwerts fahren. da es ja aber auch sein kann dass er mit der rechten seite an eine wand fährt wäre es besser wenn ich min 3 sensoren haben würde. dazu wollte ich 3 endlosschleifen nebeneienander laufen lassen die jede auf ein sensor achtet, und nicht hintereinander (wieso weiss ich jetzt leider nicht mehr nach 100 tausen befehlen, aber irgendwas gieng nicht auf weil es eben nicht gleichzeitig die befehle nebeneindare ausgeführt hat sonder nur von oben nach unten gelesen hat). desshalb dachte ich 3-4 scripts, wenn das einte mit einem sensor reagiert schliesst es alle anderen (das hab ich nicht heraus gefunden wie das geht) und öffnet ein neues script indem es kurz das wendemanöver ausführt und nachher wieder die 3-4 standart scripts laufen lässt - bis wieder ein sensor reagiert. und deshalb dachte ich xterm öffnen und kurz warten lassen (mit anschliessendem befehl gnome-terminal zu öffnen und das script auszuführen), und mit killall gnome-terminal alle terminals (mit scripts) schliessen - dann würde ja eben xterm kurz warten bis alle gnome-terminals geschlossen haben und dann wieder einen neuen öffnen. und irgendwie muss dann noch mit nohup gemacht werden dass xterm weiter läuft wenn der gnome-terminal der ihn aufgerufen hat beendet wird. ich weiss nicht ob das alles sinn macht, für leute die sich gut mit linux auskennen ist das vielleicht mega unsinnig und funktioniert nicht einmal, ich habs nur mal ausgedacht, und versuch das irgendwie zu machen.... es hat noch 3 absätze (leerzeilen?) im script, wie kann ich hier im forum absätze machen?

0
guenterhalt  27.05.2014, 18:38
@ka111

zuerst zum letzten Problem mit den Absätzen: Fahre mit der Maus beim Schreiben eines Kommentars in das blaue Feld. Das 5. Element ( ich glaube darin ein + zu erkennen ), gestattet Codezeilen zu markieren. Markiere also deinen Code-Text ( ziehen mit der Maus) und klicke danach auf diese Symbol. Dann werden auch Absätze nicht verbunden.

Zu deinem Script. Das Programmieren mit bash-Befehlen habe ich schon vor langer Zeit aufgegeben, nicht aber das Programmieren! Einer meiner Raspberri-Pi's steuert mein Haus, angefangen von Alarmanlage über Bewässerungsanlage bis zur Steuerung der Jalousien. Als Programmiersprache benutze ich die tclsh-Shell ( aptget install tcl). Ich denke damit lässt sich (auch gut lesbar) eine Ablaufsteuerung programmieren, die solche "Klimmzüge" mit mehrere laufenden Script-Dateien überflüssig macht. Jedes Teilprogramm kann über globale Variable miteinander Daten austauschen und so auch andere Funktionen ausführen.

Solltest du daran Interesse haben, kannst du auf meine Hilfe setzen.

0
ka111 
Beitragsersteller
 27.05.2014, 19:08
@guenterhalt

ok, danke. ich werd das morgen mal ausprobieren (mein kopf raucht)

0
Linuxhase  27.05.2014, 19:15
@ka111

@ka111

Dein Script sieht aber fürchterlich aus.

ich weiss nicht ob das funktioniert habs noch nicht auf dem raspberry pi, da ich noch keine räder daran gebaut habe.

Dann lasse es halt mit LEDs laufen.

dazu wollte ich 3 endlosschleifen nebeneienander laufen lassen die jede auf ein sensor achtet

Wo sollte da das Problem sein?

gieng nicht auf weil es eben nicht gleichzeitig die befehle nebeneindare ausgeführt hat

Dann hast Du es falsch geschrieben.

sonder nur von oben nach unten gelesen hat). desshalb dachte ich 3-4 scripts

Bloß nicht.

wenn das einte mit einem sensor reagiert schliesst es alle anderen (das hab ich nicht heraus gefunden wie das geht)

Da wäre function nützlich.

und irgendwie muss dann noch mit nohup gemacht werden dass xterm weiter läuft wenn der gnome-terminal der ihn aufgerufen hat beendet wird.

screen

ich weiss nicht ob das alles sinn macht

Nein, das klingt wirr, sieht auch wirr aus. Du solltest mal mit Variablen arbeiten statt mit Dateien die erzeugt und gelöscht werden sollen.

es hat noch 3 absätze (leerzeilen?) im script, wie kann ich hier im forum absätze machen?
  1. Gibt es das 5. Icon von links, damit wird Code gekennzeichnet und die Formatierung erhalten
  2. Mit dem 8. Icon kannst Du eine Trennlinie erzeugen Aber insgesamt ist gutefrage.net nicht geeignet um soclhe Projekte zu verarbeiten, besser ist es soclhe Dinge in Foren zu fragen: linux-forum.de z.B.

Linuxhase

0
ka111 
Beitragsersteller
 29.05.2014, 15:55
@Linuxhase

(ich muss das alles später mal genau anschauen, nur schon bis ich mich über semaphoren, signalling ... schlau gemacht habe geht das wieder eine weile, und all diese befehle ausprobieren und dem problem mit den 3 endlosschleifen nachgehen geht auch gleich nochmals eine ewigkeit)

0
ka111 
Beitragsersteller
 23.05.2014, 21:31

hmm.. wie kann ich dann den befehl cd test an den anderen terminal weiterleiten? oder sleep 1s zB? diese 2 befehle kann ich irgendwie nicht mit > ...... weiterleiten. vielleicht kann man es wie einklammern, zB [sleep 1] > /dev/pts/3. aber mit [ { ( geht es nicht..

0
Weller500  24.05.2014, 03:18
@ka111

Man muss das Terminal wie eine sehr alte Textverarbeitung ansehen. Will man Befehle übergeben oder deren Werte geschieht dies mit > oder |

Beispiel

dmesg | grep -i vga

dmesg steht für den Deamon Messenger . Er speichert alles was über den Kernel Installiert und auch an Treibern verwendet wurde ( Ähnlich vergleichbar mit der Ereignisanzeige von Windoof) . Der Befehl | übergibt so die Ausgabewerte von dmesg an grep . Grep durchsucht die Information von dmesg und filtert Sie nach der Vorgabe vga. Anders ausgedrückt. Er stellt alles dar wo das Wort vga darin vorkommt. Die option -i steht eigentlich für "ignore" das zu case sensitive gehört. grep durchsucht also alles wo vga darin vorkommt egal ob es GROß oder Kleingeschrieben wurde.

Es wäre für dich besser sich mal ein Buch zu kaufen über Linux ,da sind auch viele Beispiele erwähnt die dir schön erklären wie man was macht.

0
guenterhalt  24.05.2014, 09:07
@ka111

ich sehe keine Möglichkeit, eine Befehl in einem anderen Terminal durch "Fernsteuerung" auszuführen.

cd irgendwohin wird es so wohl auch nicht geben. Die laufende Shell und die Anzeige im Terminal sind zwei verschieden Sachen.

0
Linuxhase  26.05.2014, 17:49
@guenterhalt

@guenterhalt

ich sehe keine Möglichkeit, eine Befehl in einem anderen Terminal durch "Fernsteuerung" auszuführen.

Damit geht es ja eingeschränkt:

Process proc = Runtime.getRuntime().exec("$(cd test)");

Aber insgesamt wäre das ja auch nicht so wünschenswert für den "überfallenen" User.

Aber eventuell teilt uns der Fragesteller ja noch mit ob er wirklich ein anderes Terminal des selben Systems oder das eines entfernten Systems meint.

Linuxhase

0
guenterhalt  26.05.2014, 19:47
@Linuxhase

manchmal ist es wirklich die Zeit, die der eine oder der andere nicht hat, in den meisten Fällen vermute ich aber einfach nur Anstand, der abhanden gekommen ist.

0

Mir ist nicht ganz klar, was du willst!

Geht es um die Ausgabe aufs Terminal aus einem Script heraus?

Wenn ja, kann das erledigt werden mit

echo -e "\n\tHallo ...\n"

willst du etwas einlesen, geht das mit

read -p "Gib was ein: " Variable

Um die Eingabe zu verarbeiten

echo -en "\n\tich habe gelesen: '$Variable'\n"

ein etwas komplexeres Beispiel habe ich erst vor kurzem hier vorgestellt. Suchen muß du aber selbst!

Ansonsten:

mit

ssh -l <user> -X <rechner>

kannst du dich auf jedem belibigen Linux-System anmelden, voraus gesetzt, ssh ist auf beiden Rechners installiert und der entfernte Rechner akzeptiert ssh-Verbindungen.

Wenn du statt "rechner" mal localhost verwendest, machtst du eine neue Sitzung auf deinem eigenen Rechner auf.

Während einer ssh-Sitzung arbeitest du vollständig auf dem anderen (oder dem eigenen) Rechner, lediglich die Ein- und Ausgabe geschieht auf dem localen Rechner.

Das ist ein Merkmal von Unix und Linux hat das voll übernommen.

Du kannst so - auf dem entfernten Rechner - beliebige Programme starten. Auch - und insbesondere - solche mit grafischer Bedienung. Das gilt auch für die Maus!

Ich lasse so etwas aufwendigere Programme auf dem entferntern schnelleren Rechner laufen und habe so lokal mehr Möglichkeiten.

Woher ich das weiß:eigene Erfahrung – Intensive Beschäftigung hiermit seit etlichen Jahren

ka111 
Beitragsersteller
 27.05.2014, 12:48

ja es geht um die ausgabe aufs terminal aus einem script heraus.. ich wollte sleep 1m vom gnome-terminal aus an xterm senden, aber immer wenn ich sleep an xterm oder auch einen anderen gnome-terminal weiterleiten will wartet es selbst eine minute und schickt das nicht an den terminal weiter den ich mit > /dev/pts/3 angegeben habe. das mit echo -en "\n\tich habe gelesen: '$Variable'\n" wusste ich noch nicht, danke

0
GWBln  27.05.2014, 14:08
@ka111
ich wollte sleep 1m vom gnome-terminal aus an xterm senden

worin liegt da der Sinn?

Das einzigste, für mich sinnvoll erscheinende wäre, innerhalb eines Scripts (welches aus irgendwelchen Gründen sonst zu schnell ist, auf ein Ereignis gewartet werden soll), und das (remote) ausgeführt wird, z.B. so

ssh -l USER -X RECHNER /bin/bash /home/USER/Script

Inhalt dieses Scriptes könnte sein

#!/bin/bash
# ... irgendwelche Kommandos
sleep 1m
# ... weitere Kommandos

Hierbei kann der erste Parameter entfallen, wenn die Benutzer (eigentlich die UID) übereinstimmen.

RECHNER kann auch localhost sein, wobei man da auch noch ein DISPLAY angeben kann.

Wie du wohl weißt, kann man (mit Strg+Alt+F7 oder Strg+Alt+F8) extrem schnell zwischen zwei vollkommen getrennten grafischen Sitzungen umschalten. Klar sollte sein, daß dies getrennte Benutzer-Accounts sein können.

Das liegt einfach daran, daß Linux ein echtes Multi-User-System ist!

Mach das mal unter Windows! Dauert mindestens 10 Mal so lange ... unter Linux (in meinem Ubuntu) ist es weniger als eine halbe Sekunde!

0
ka111 
Beitragsersteller
 27.05.2014, 14:41
@GWBln

ja die idee wäre 4 scripts gleichzeitig laufen zu lassen die immer schauen ob in einer datei 1 oder 0 steht, wenn dann mal 0 ausgelesen wird beenden sich alle 4 scripts und starten ein neues das nur kurz läuft und anschliessend wieder die anderen 4 scripts startet und sich selbst beendet. da ich aber von linux nicht so ahnung habe und es irgendwie immer sehr lange geht bis ich den nächsten befehl richtig herausgefunden habe fällt mir nur ein an xterm: (kurz warten, gnome-terminal öffnen, script starten) + killall gnome-terminal, dann sollte ja eben xterm starten und kurz warten bis alle gnome-terminal geschlossen sind und dann das script in einem neuen gnome-terminal starten. und danach wieder das selbe nur die alten 4 wieder starten

0
GWBln  27.05.2014, 17:23
@ka111

ich schreibe das mal als neue Antwort ...

0

Hallo

Weiss jemand wie ich bei Ubuntu die enter Taste an einen Terminal weiterleiten kann?
  • Das kommt darauf an wo sich das andere Terminal befindet und ob Du die Berechtigung hast dort etwas auszugeben oder sogar auszuführen.
  • Ist das beides auf dem gleichen Rechner oder an einem entfernten?

Als kleiner Hinweis wäre das hier eventuell brauchbar für Dich:

Process proc = Runtime.getRuntime().exec("$(cd test)");

Danach werden dann alle Kommandos nicht mehr im Terminal ausgegeben wo Du es eingegeben hast. Beispiel:

cd test

Oder sowas hier:

echo > /dev/pts/1 $(whoami)

Das Kommando in einem Terminal gestartet, führt das Kommando $(whoami) im Terminal pts/1 aus, mit den Rechten des dort angemeldeten Benutzers.


Geht es nur darum Kommandos auf einem entfernten Computer (z.B. Server) auszuführen dann so:

ssh user@entfernter-pc KOMMANDO

Linuxhase

Woher ich das weiß:eigene Erfahrung – Ich benutze seit 2007 Linux und habe LPIC101 und LPIC102

ka111 
Beitragsersteller
 27.05.2014, 12:59

ja ist beides auf dem gleichen rechner. hmm.. und wo wird dann alles ausgegeben nachdem Process proc =.... ?? oder was passiert wenn ich diesen satz so im terminal eingebe? kann ich nachher den terminal einfach schliessen und dann ist's so als ob ich diesen satz nie eingegeben habe?

0
guenterhalt  24.05.2014, 09:04
echo > /dev/pts/1 $(whoami)

zeigt aber doch auch nur den User an, der diesen Befehl ausgelöst hat. auch:

 echo > /dev/pts/1 $(ls -l)

lenkt nur das lokale ls -l auf das Terminal pts/1 um.

0
Linuxhase  24.05.2014, 16:34
@guenterhalt

@guenterhalt

zeigt aber doch auch nur den User an, der diesen Befehl ausgelöst hat. auch:

Wenn root den Befehl ausführt erscheint auf dem Terminal vom linuxhase der Name root

Wirkliche Umleitung ist dann eher über das erste Kommando zu erreichen.

Linuxhase

0
guenterhalt  24.05.2014, 22:15
@Linuxhase

genau das habe ich geschrieben. @ka111 möchte aber, so habe ich seine Frage verstanden, dass der angegeben Befehl in der Umgebung des remote-Terminals ausgeführt wird. Der Befehl müsst somit der Shell in remote-Terminal übergeben und ausgeführt werden.

Das würde aber sehr gefährlich sein, denn ein Befehl mit der ID des Terminal-Owner ausgeführt, würde dann auch nicht vor rm -rf * halt machen.

1