Как открыться, процесс заменил файлом от php?

Самая простая форма для расширения параметра: ${parameter}.
Используя фигурные скобки в запутанном случае лучший путь.

Рассматривание возможностей того, чтобы быть включенным располагает с интервалами в массиве "myvarA", я думаю, что это было бы ответом.

#!/bin/bash -x
myvarA=( "variable  A1" "variable  A2" )
varname="A"

eval varAlias=( '"${myvar'${varname}'[@]}"' )
eval varAlias=( \"\${myvar${varname}[@]}\" ) # both works
for varItem in "${varAlias[@]}" # double quote and `@' is needed
do
    echo "$varItem"
done
3
05.05.2013, 16:39
4 ответа

Это - проблема:

readlink("/dev/fd/63", "pipe:[405116]"..., 4096) = 13
lstat("/dev/fd/pipe:[405116]", 0x7fff5ea44850) = -1 ENOENT

Без любого серьезного основания (по моему скромному мнению), php попытки получить настоящее имя цели ссылки. К сожалению, цель ссылки не является частью файловой системы таким образом попытка получить доступ к тому имени сбои и вызывает эту ошибку. Символьная ссылка может только быть открыта как таковая. Я считаю это ошибкой в php. Вы могли использовать FIFO вместо этого:

mkfifo /my/fifo; output_cmd >/my/fifo & php -r ... /my/fifo
1
27.01.2020, 21:24
  • 1
    Но php, открывая файл самостоятельно, делает те же системные вызовы, и файл открыт успешно. Посмотрите обновленный вопрос. Совместное использование –  x-yuri 04.05.2013, 12:38
  • 2
    @x-yuri нет ни "файла", ни "самостоятельно". В обоих случаях существует a lstat("/dev/fd/pipe:[405116]", 0x7fff5ea44850) = -1 ENOENT звонить. К сожалению, вторые концы блока одна строка слишком рано. Что делает open() вызов в файл похож? Возможно, php может быть обманут в открытие пути ссылок вместо "физического" пути. Но это не может быть вынуждено покинуть внешнюю сторону. –  Hauke Laging 04.05.2013, 15:56
  • 3
    Больше нет системных вызовов php <(отзовитесь эхом 12), случай. Я только забыл добавлять вывод самого сценария. –  x-yuri 05.05.2013, 16:51
  • 4
    @x-yuri файл, очевидно, не открыт, если существует нет open() или openat(). Недостающее сообщение об ошибке не означает, что файл был открыт успешно. –  Hauke Laging 05.05.2013, 17:02
  • 5
    , который я имел в виду, существует только один вызов к open(), на второй строке вывода (open("/dev/fd/63"...). Не в конце. Так, файл открыт. И скрипт запущен, таким образом, файл открыт успешно. На всякий случай... отметьте, кто пытается открыть файл: php -r '...file_get_contents(...' -- <(echo 12) - файл открыт сценарием. php <(echo 12) - файл открыт самим php и содержит сценарий. –  x-yuri 05.05.2013, 18:23
[116605] Проблема в том, что вы хотите, чтобы php читал входные данные из файлового дескриптора, но заставляете его читать как обычный файл.
  • Сначала попробуйте так:
  • и тогда вы сможете обработать выходные данные [117028]ls[117029], прочитав [117030]/dev/fd/63[117031]. Подстановка процесса вернёт дескриптор файла [117032], который используется другой командой для чтения его вывода.

    В вашем случае вы используете [117034]$_SERVER["argv"][1][117035], что означает, что php будет интерпретировать подобным образом:

    Из руководства php, здесь вы можете увидеть прототип функции [117036]file_get_contents[117037]:

    Ops, php будет считать [117038]/dev/fd/63[117039] обычным файлом, но на самом деле это файловый дескриптор [117040]file descriptor[117041].

    Для доступа к дескриптору файла вы должны использовать [117042]php://fd[117043], [117044]php://fd/63[117045] получит доступ к содержимому файлового дескриптора 63:

    Видите ли, теперь php может обрабатывать содержимое в [117046]/dev/fd/63[117047]. Но нашей целью является чтение содержимого файла, которое предоставляется через подстановку процесса (в моем примере это [117048]test.txt[117049]). Я мало знаю о php, поэтому добавил еще один [117050]file_get_contents[117051]:

    Я использую [117052]echo -n[117053] для удаления newline из echo ouput, иначе php увидит ouput "test.txt\n".

    Примечание

    Подробнее о доступе к дескриптору файла в php вы можете посмотреть [117056]здесь[117057].[116626].
    2
    27.01.2020, 21:24

    Вот что я в итоге использовал ...

    php -r "var_dump(file_get_contents('php://stdin'));" < <(echo this is a win)
    

    Если вы пытаетесь делать другие вещи с помощью stdin, это явно не сработает для вас, и это ничем не отличается от

    php -r "var_dump(stream_get_contents(STDIN));" < <(echo this is a win)
    

    , что заставляет меня задуматься, что это вы на самом деле пытались сделать, и почему вы застряли на file_get_contents? :)

    Ссылка - http://php.net/manual/en/wrappers.php.php

    0
    27.01.2020, 21:24

    Это старый вопрос, но я только что нашел ответ, поэтому решил поделиться им. Может быть, это поможет кому-то.

    Вместо этого вы можете использовать потоковую оболочку php://, чтобы открыть файловый дескриптор:

     $fd = $argv[1];
     $handle = fopen(str_replace('/dev/','php://',$fd)); 
    

    Таким образом, вместо открытия файлового дескриптора /dev/fd/[nn], предоставляемого ОС. Вы откроете php://fd/[nn], что сработает. Я не уверен, почему открытие дескриптора файла не удается в некоторых системах, но не в других.

    Это была старая ошибка , которая должна была быть исправлена.

    1
    27.01.2020, 21:24

    Теги

    Похожие вопросы