1

Ich habe versucht, die folgenden Beispiele wie:Unterstützt PHP Prozesssubstitution?

$ php -r 'require_once($argv[1]);' <(echo "hello") 

oder:

$ php -r 'file_get_contents($argv[1]);' <(echo "hello") 

beide nicht wie:

PHP Warning: require_once(/dev/fd/63): failed to open stream: No such file or directory in Command line code on line 1

PHP Warning: file_get_contents(/dev/fd/63): failed to open stream: No such file or directory in Command line code on line 1

oder:

$ php -r 'file_get_contents($argv[0]);' < <(echo "hello") 

, die versagt w ith:

PHP Fatal error: require_once(): Failed opening required '-' (include_path='.:/usr/share/pear:/usr/share/php') in Command line code on line 1

Die obigen Versuche wurden von drush Befehl inspiriert, zum Beispiel:

$ drush --early=<(echo print 123';') "" 
[warning] require_once(/dev/fd/63): failed to open stream: No such file or directory preflight.inc:58 

wo ich den dynamischen PHP-Code aus dem Dateideskriptor (ohne die Schaffung eine separate Datei jedes Mal) injizieren könnte in Um den Code vor dem Bootstrapping des Hauptcodes auszuführen.


Andere ähnliche Befehle Tools ordnungsgemäß funktionieren:

$ cat <(echo "hello") 
hello 

oder:

$ python -c "import sys; print sys.stdin.readlines()" < <(echo "hello") 
['hello\n'] 

Ich habe das gefunden PHP bug und this one, aber diese vor langer Zeit festgelegt wurde und ich m mit 5.6.22.

Gibt es eine Möglichkeit, dass ich PHP in das Lesen von Daten aus der Prozesssubstitution (zum Lesen von Dateideskriptor, z. B. /dev/fd) beim Aufruf von CLI, mit einem einfachen One-Liner?

Antwort

1

Die Fehlermeldung gibt einen guten Hinweis: PHP kann die angegebene Datei nicht finden.

Aber warte, welche Datei? Nun, lassen Sie uns daran erinnern, was process substitution ist:

Process substitution is a form of redirection where the input or output of a process (some sequence of commands) appear as a temporary file.

Und Sie so sehen, wenn Sie das Argument drucken Sie auf diese Weise bieten:

$ php -r 'print $argv[1];' <(echo "a") 

Für mich gibt folgende temporäre Datei:

/dev/fd/63 

Also ja, Sie können Prozesssubstitution mit PHP verwenden, aber nicht dafür.

Wenn das, was Sie wollen, ist die Ausgabe des Befehls als Argument zu verwenden, nur $() verwenden um es zu erweitern:

$ php -r 'print $argv[1];' "$(echo "hello man")" 
hello man 
+0

'$ argv [1]' kehrt Dateideskriptor ('/ dev/fd/63'), so ist das richtig, aber ich weiß nicht, warum es es nicht lesen kann. Ihr letztes Beispiel verwendet _command substitution_, nicht _process substitution_. Ich bin also eher daran interessiert, das Beispiel mit _process substitution_ zu sehen. – kenorb

+0

@kenorb Die Sache ist, dass die Prozesssubstitution hier einen Dateideskriptor liefert, von dem es die Zeichenkette "a" liest. Sie können den Inhalt eines Dateideskriptors nicht vorbestimmen, damit er die gewünschten Daten enthält. Was genau möchten Sie tun? Geben Sie einen variablen Dateinamen ein? – fedorqui

+0

Ich spielte mit Drush: 'drush --early = <(echo print 123)" "' was mir 'require_once (/ dev/fd/63)' Fehler gab, also fragte ich mich, ob es alternative Syntax gibt, die ich verwenden könnte , weil das Verwenden der Befehlsersetzung in diesem Fall nicht funktioniert. Es könnte eine Sache für eine andere Frage sein, aber auf der anderen Seite wäre das zu ähnlich. Grundsätzlich ist es nicht speziell zu drush, aber ich wollte herausfinden, ob PHP Dateibeschreibungen unterstützen kann, ob es ein Fehler oder ein Design ist. – kenorb

Verwandte Themen