expertenaustausch > comp.os.* > comp.os.unix.shell

Peter Blancke (07.05.2020, 18:12)
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
Michael Schütz (07.05.2020, 19:52)
Peter Blancke <blancke> schrieb:
> Guten Tag, ....
> 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'?
Juergen Ilse (07.05.2020, 20:21)
Hallo,

Michael Schütz <der.schultze> wrote:
> 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.

> 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 (juergen)
Sieghard Schicktanz (07.05.2020, 20:35)
Hallo Peter,

Du schriebst am Thu, 7 May 2020 16:12:10 +0000 (UTC):

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


Weder noch, Du hast ein X-Problem.

> Während ich aus einem unter Bash geschriebenen Skript den Editor vim
> problemlos aufrufen kann, ergibt der Aufruf aus dem ....
> 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.

> 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.

--
Juergen Ilse (08.05.2020, 02:35)
Hallo,

Sieghard Schicktanz <Sieghard.Schicktanz> wrote:
> Du schriebst am Thu, 7 May 2020 16:12:10 +0000 (UTC):
>> 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.

> ...
> 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.

> 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 (juergen)
Peter Blancke (08.05.2020, 07:57)
Am 2020-05-07, Juergen Ilse <news> schrieb:

> Michael Schütz <der.schultze> wrote:


>> 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
Josef Moellers (08.05.2020, 08:24)
On 08.05.20 07:57, Peter Blancke wrote:
> Am 2020-05-07, Juergen Ilse <news> schrieb:
>> Michael Schütz <der.schultze> wrote:
>>> 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!

> Oder anders gefragt:
> 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.

> 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.

> - 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
Enrik Berkhan (08.05.2020, 08:39)
Moin,

Peter Blancke <blancke> wrote:
> Am 2020-05-07, Juergen Ilse <news> schrieb:
>> 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.

> Oder anders gefragt:
> 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.

> 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
Peter Blancke (08.05.2020, 09:01)
Am 2020-05-08, Josef Moellers <josef.moellers> schrieb:

> On 08.05.20 07:57, Peter Blancke wrote:


> 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.


> Zwei mögliche Lösungen:
> 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.

> 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
Juergen Ilse (08.05.2020, 14:06)
Hallo,

Peter Blancke <blancke> wrote:
> Am 2020-05-07, Juergen Ilse <news> schrieb:
>> Michael Schütz <der.schultze> wrote:
>>> 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).

> ,----
> | #!/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?


Vielleicht vererbt php-cli sein controlling terminal nicht weiter.
Ich habe damit noch nie gearbeitet.

Tschuess,
Juergen Ilse (juergen)
Ähnliche Themen