Самая простая форма для расширения параметра: ${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
Это - проблема:
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
и тогда вы сможете обработать выходные данные [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].
Видите ли, теперь 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].Вот что я в итоге использовал ...
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? :)
Это старый вопрос, но я только что нашел ответ, поэтому решил поделиться им. Может быть, это поможет кому-то.
Вместо этого вы можете использовать потоковую оболочку php://
, чтобы открыть файловый дескриптор:
$fd = $argv[1];
$handle = fopen(str_replace('/dev/','php://',$fd));
Таким образом, вместо открытия файлового дескриптора /dev/fd/[nn]
, предоставляемого ОС. Вы откроете php://fd/[nn]
, что сработает. Я не уверен, почему открытие дескриптора файла не удается в некоторых системах, но не в других.
Это была старая ошибка , которая должна была быть исправлена.
lstat("/dev/fd/pipe:[405116]", 0x7fff5ea44850) = -1 ENOENT
звонить. К сожалению, вторые концы блока одна строка слишком рано. Что делаетopen()
вызов в файл похож? Возможно, php может быть обманут в открытие пути ссылок вместо "физического" пути. Но это не может быть вынуждено покинуть внешнюю сторону. – Hauke Laging 04.05.2013, 15:56open()
илиopenat()
. Недостающее сообщение об ошибке не означает, что файл был открыт успешно. – Hauke Laging 05.05.2013, 17:02open()
, на второй строке вывода (open("/dev/fd/63"...
). Не в конце. Так, файл открыт. И скрипт запущен, таким образом, файл открыт успешно. На всякий случай... отметьте, кто пытается открыть файл:php -r '...file_get_contents(...' -- <(echo 12)
- файл открыт сценарием.php <(echo 12)
- файл открыт самим php и содержит сценарий. – x-yuri 05.05.2013, 18:23