Discussion:
Vim aus bash und aus php aufrufen
(zu alt für eine Antwort)
Peter Blancke
2020-05-07 16:12:10 UTC
Permalink
Guten Tag,

ich bin mir nicht sicher, ob ich ein Shell-, Bash- oder PHP-Problem
habe.

Während ich aus einem unter Bash geschriebenen Skript den Editor vim
problemlos aufrufen kann, ergibt der Aufruf aus dem
Kommandozeileninterpreter PHP via system() und auch exec() und
dergl. die Meldung auf der Konsole

Vim: Achtung: Die Ausgabe erfolgt nicht auf einem Terminal

Ich kann dann den vim noch durch blindes Eintippen von ":q" beenden.

Was muß ich an den Komponenten Shell/Bash/PHP ändern, um aus einem
PHP-Skript den VIM-Editor aufrufen zu können? Wegen des Umfangs des
PHP-Skripts ist ein Umschreiben auf Bash oder dergl. so gut wie
unmöglich. Nach Aufruf des Editors soll nach dessen Beendigung
wieder ins Skript zurückgekehrt werden.

Danke für jedwede Hilfen.

Gruß,

Peter Blancke
--
Hoc est enim verbum meum!
Michael Schütz
2020-05-07 17:52:27 UTC
Permalink
Post by Peter Blancke
Guten Tag,
...
Post by Peter Blancke
Was muß ich an den Komponenten Shell/Bash/PHP ändern, um aus einem
PHP-Skript den VIM-Editor aufrufen zu können? Wegen des Umfangs des
PHP-Skripts ist ein Umschreiben auf Bash oder dergl. so gut wie
unmöglich. Nach Aufruf des Editors soll nach dessen Beendigung
wieder ins Skript zurückgekehrt werden.
Ehrlich gesagt, habe ich keine Ahnung von der Materie, aber braucht vim
nicht eine shell um darin zu laufen? Kannst Du eine shell aufrufen in
etwa mit '/bin/sh vim'?
Post by Peter Blancke
Danke für jedwede Hilfen.
Gruß,
Peter Blancke
--
Ich glaube erst an "Bio", wenn die Schweine Birkenstock tragen.
Horst Lichter
Juergen Ilse
2020-05-07 18:21:53 UTC
Permalink
Hallo,
Post by Michael Schütz
Ehrlich gesagt, habe ich keine Ahnung von der Materie, aber braucht vim
nicht eine shell um darin zu laufen?
Nein ein "controlling terminal", wenn er interaktiv benutzt werden soll ...
Nein, das ist *nicht* das selbe.
Post by Michael Schütz
Kannst Du eine shell aufrufen in
etwa mit '/bin/sh vim'?
Moeglicherweise koenntes funktionieren, wenn man eine "screen" session mit
vim drin startet, und sich dann mit "screen -r" an die Session verbindet.

Tschuess,
Juergen Ilse (***@usenet-verwaltung.de)
Peter Blancke
2020-05-08 05:57:52 UTC
Permalink
Post by Juergen Ilse
aber braucht vim nicht eine shell um darin zu laufen?
Nein ein "controlling terminal", wenn er interaktiv benutzt werden soll ...
Warum kann die Bash das?

,----
| #!/bin/bash
| echo Jetzt startet Vim...
| vim zubearbeitende datei
| echo Jetzt ist Vim beendet.
`----

Oder anders gefragt:

Warum reagiert die Bash korrekt, aber PHP-Cli macht das nicht?

Irgendwie müßte man doch dem Systemaufruf in PHP system()
unterschieben können, daß er

- die Bash benutzen soll
- und darin auch die erforderlichen Umgebungsvariablen (vermutlich
$TERM und/oder $DISPLAY) vorfindet.

Gruß,

Peter Blancke
--
Hoc est enim verbum meum!
Josef Moellers
2020-05-08 06:24:28 UTC
Permalink
Post by Peter Blancke
Post by Juergen Ilse
aber braucht vim nicht eine shell um darin zu laufen?
Nein ein "controlling terminal", wenn er interaktiv benutzt werden soll ...
Warum kann die Bash das?
Das eine schließt das andere ja nicht aus!
Post by Peter Blancke
Warum reagiert die Bash korrekt, aber PHP-Cli macht das nicht?
Es sieht so aus, als ob die Standard-Ausgabe in eine Datei oder etwas
anderes umgeleitet wird, so wie "vim > /tmp/output". Standard-Eingabe
geht ja wohl noch.
Vim bzw die terminfo-Bibliothek erkennt das, wei das verändern der
Standard-Ein- und -Ausgabe-Parameter fehl schlägt.
Post by Peter Blancke
Irgendwie müßte man doch dem Systemaufruf in PHP system()
unterschieben können, daß er
- die Bash benutzen soll
Das wird wohl nicht viel helfen, denn die Bash würde dann mit der
"umgeleiteten" Standard-Ausgabe gestartet und diese an den Vim vererben.
Post by Peter Blancke
- und darin auch die erforderlichen Umgebungsvariablen (vermutlich
$TERM und/oder $DISPLAY) vorfindet.
Zwei mögliche Lösungen:
1) /bin/vim > /dev/tty
2) ein grafisches Terminal (xterm, kconsole, ...) starten, der dann
seinerseits den vim aufruft.

Bleibt gesund,

Josef
Peter Blancke
2020-05-08 07:01:56 UTC
Permalink
Post by Josef Moellers
Es sieht so aus, als ob die Standard-Ausgabe in eine Datei oder
etwas anderes umgeleitet wird, so wie "vim > /tmp/output".
Standard-Eingabe geht ja wohl noch.
Vim bzw die terminfo-Bibliothek erkennt das, wei das verändern der
Standard-Ein- und -Ausgabe-Parameter fehl schlägt.
1) /bin/vim > /dev/tty
In der Tat: Diese Lösung funktioniert:

#!/usr/bin/php

,----
| <?php
|
| print "Vor Vim: ".date('H:i:s');
| sleep(3);
| system("/usr/bin/vim zu_bearbeitende_datei > /dev/tty");
| sleep(3);
| print "Nach Vim: ".date('H:i:s');
|
| ?>
`----

So läuft es sowohl unter X als auch auf normaler Konsole.

Die beiden sleep() habe ich eingebaut, damit ich da besser zuschauen
kann, was da passiert.

Die beiden date() habe ich eingebaut, damit ich weiß, daß der
system()-Befehl auch wirklich wartet, bis Vim beendet wurde.
Post by Josef Moellers
2) ein grafisches Terminal (xterm, kconsole, ...) starten, der dann
seinerseits den vim aufruft.
Dann würde es unter der Konsole nicht mehr gehen. Außerdem wird das
graphische Terminal (hier xfce4-terminal) gestartet und der
PHP-system()-Aufruf kehrt sofort zurück. Aber das was, was mit Vim
bearbeitet wurde, soll anschließend im Skript von PHP
weiterverarbeitet werden.

Vielen Dank für den Anstoß! Obiges Skript läuft wie gewünscht!

Gruß,

Peter Blancke
--
Hoc est enim verbum meum!
Enrik Berkhan
2020-05-08 06:39:56 UTC
Permalink
Moin,
Post by Peter Blancke
Post by Juergen Ilse
Nein ein "controlling terminal", wenn er interaktiv benutzt werden soll ...
Warum kann die Bash das?
Wenn die bash interaktiv mit einem controlling terminal läuft, braucht
sie dafür nichts weiter zu können. Sie reicht einfach stdin/stdout
geeignet durch.
Post by Peter Blancke
Warum reagiert die Bash korrekt, aber PHP-Cli macht das nicht?
php-cli gibt bei einem system()-Aufruf pipes an den gestarteten Prozess
als stdin/stdout, damit die Ausgabe 'zurückgelesen' werden kann.
passthru() statt system() scheint auch nicht zu helfen.
Post by Peter Blancke
Irgendwie müßte man doch dem Systemaufruf in PHP system()
unterschieben können, daß er
#v+
<?php

system("vim bla.txt < /dev/tty > /dev/tty 2>&1");

?>
#v-

Viele Grüße,
Enrik
Christoph 'Mehdorn' Weber
2020-07-11 17:01:44 UTC
Permalink
Hallo!
Post by Enrik Berkhan
php-cli gibt bei einem system()-Aufruf pipes an den gestarteten Prozess
als stdin/stdout, damit die Ausgabe 'zurückgelesen' werden kann.
passthru() statt system() scheint auch nicht zu helfen.
An passthru() hätte ich jetzt auch am ehesten gedacht.

Aber ich könnte mir gut vorstellen, daß der Output-Buffer da
noch negative Auswirkungen hat, der IIRC standardmäßig aktiv ist.
Eventuell sollte man vorher noch ob_end_clean()/ob_end_flush()
probieren.

Christoph
--
Es ist schwierig, die zur Softwareentwicklung unbedingt
notwendigen alten bzw. kaputten Klamotten zu kaufen.
Besser ist es, man bricht einen Altkleidercontainer auf.
(Joerg Jonas)
Juergen Ilse
2020-05-08 12:06:57 UTC
Permalink
Hallo,
Post by Peter Blancke
Post by Juergen Ilse
aber braucht vim nicht eine shell um darin zu laufen?
Nein ein "controlling terminal", wenn er interaktiv benutzt werden soll ...
Warum kann die Bash das?
Ich bin jetzt zu faul, damit herumzuprobieren, aber meines Erachtens nach
kann die bash das auch nicht. Die bash (im interaktiven Betrieb) hat das
"controlling terminal" von ihrem Parent-Prozess (telnet- oder ssh-Session,
xterm, gnome-terminal, screeen-Session, was auch immer) geerbt und vererbt
es an ihre child-Prozesse. Wird die bash von etwas gestartet, was noch kein
"controlling terminal hat, kann sie das controlling terminal auch nicht
weitervererben (und tut das dann logischerweise auch nicht).
Post by Peter Blancke
,----
| #!/bin/bash
| echo Jetzt startet Vim...
| vim zubearbeitende datei
| echo Jetzt ist Vim beendet.
`----
Warum reagiert die Bash korrekt, aber PHP-Cli macht das nicht?
Vielleicht vererbt php-cli sein controlling terminal nicht weiter.
Ich habe damit noch nie gearbeitet.

Tschuess,
Juergen Ilse (***@usenet-verwaltung.de)
Sieghard Schicktanz
2020-05-07 18:35:01 UTC
Permalink
Hallo Peter,
Post by Peter Blancke
ich bin mir nicht sicher, ob ich ein Shell-, Bash- oder PHP-Problem
habe.
Weder noch, Du hast ein X-Problem.
Post by Peter Blancke
Während ich aus einem unter Bash geschriebenen Skript den Editor vim
problemlos aufrufen kann, ergibt der Aufruf aus dem
...
Post by Peter Blancke
Was muß ich an den Komponenten Shell/Bash/PHP ändern, um aus einem
PHP-Skript den VIM-Editor aufrufen zu können? Wegen des Umfangs des
Du mußt wohl fertigbringen, dem vim ein "viturlles Terminal" (aka pty) für
seine Ausgaben bereitzustellen, auf dem er dann den Cursor positionieren
und die nötigen Text-Schnipsel ausgeben kann. Standard-I/O reicht für ein
bildschirmorientiertes Programm nicht, das ist aber alles, was von einem
Browser normalerweise zur Verfügung gestellt wird.
Post by Peter Blancke
PHP-Skripts ist ein Umschreiben auf Bash oder dergl. so gut wie
unmöglich. Nach Aufruf des Editors soll nach dessen Beendigung
wieder ins Skript zurückgekehrt werden.
Das scheint ja schon zu funktionieren - wenn Du dem vim aber extern ein pty
"unterschiebst", mußt Du wohl nach dessen Beendigung noch dafür sorgen, daß
das auch ordentlich geschlossen wird.
Oder Du machst's Dir einfach und rufst den vim als in einem X-Terminal
auszuführendes Programm auf, sowas wie "xterm -e vim". Dann sorgt das
X-Terminal für die richtige Umgebung und deren Aufräumen.
--
--
(Weitergabe von Adressdaten, Telefonnummern u.ä. ohne Zustimmung
nicht gestattet, ebenso Zusendung von Werbung oder ähnlichem)
-----------------------------------------------------------
Mit freundlichen Grüßen, S. Schicktanz
-----------------------------------------------------------
Juergen Ilse
2020-05-08 00:35:49 UTC
Permalink
Hallo,
Post by Sieghard Schicktanz
Post by Peter Blancke
ich bin mir nicht sicher, ob ich ein Shell-, Bash- oder PHP-Problem
habe.
Weder noch, Du hast ein X-Problem.
Mi X hat das wirklich nichts zu tun.
Post by Sieghard Schicktanz
Post by Peter Blancke
Während ich aus einem unter Bash geschriebenen Skript den Editor vim
problemlos aufrufen kann, ergibt der Aufruf aus dem
...
Post by Peter Blancke
Was muß ich an den Komponenten Shell/Bash/PHP ändern, um aus einem
PHP-Skript den VIM-Editor aufrufen zu können? Wegen des Umfangs des
Du mußt wohl fertigbringen, dem vim ein "viturlles Terminal" (aka pty) für
seine Ausgaben bereitzustellen, auf dem er dann den Cursor positionieren
und die nötigen Text-Schnipsel ausgeben kann.
Das ist richtig, aber mit X hat es dennoch nichts zu tun.
Post by Sieghard Schicktanz
Das scheint ja schon zu funktionieren - wenn Du dem vim aber extern ein pty
"unterschiebst", mußt Du wohl nach dessen Beendigung noch dafür sorgen, daß
das auch ordentlich geschlossen wird.
Deswegen meine Idee mit der "screen" Session.

Tschuess,
Juergen Ilse (***@usenet-verwaltung.de)
Loading...