Bash-скрипт для запуска «pecl install oci8»

Bash-скрипт для запуска «pecl install oci8»

Я пытаюсь создать скрипт оболочки, который выполнит начальную подготовку виртуальной машины Vagrant (работающей под управлением Ubuntu 12.04). Все (установка php, apache, oracle instantclient и т. д.) работает отлично, за исключением последнего шага — установки расширения php oci8:

pecl install oci8

Когда я запускаю эту команду вручную (с префиксом sudo), она работает нормально. Но когда скрипт запускает эту команду, она дает такой сбой:

running: make
/bin/bash /tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/libtool --mode=compile cc  -I. -I/tmp/pear/temp/oci8 -DPHP_ATOM_INC -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/include -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/main -I/tmp/pear/temp/oci8 -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -DHAVE_CONFIG_H  -g -O2   -c /tmp/pear/temp/oci8/oci8.c -o oci8.lo
libtool: compile:  cc -I. -I/tmp/pear/temp/oci8 -DPHP_ATOM_INC -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/include -I/tmp/pear/temp/pear-build-rootG74SsU/oci8-2.0.6/main -I/tmp/pear/temp/oci8 -I/usr/include/php5 -I/usr/include/php5/main -I/usr/include/php5/TSRM -I/usr/include/php5/Zend -I/usr/include/php5/ext -I/usr/include/php5/ext/date/lib -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DHAVE_CONFIG_H -g -O2 -c /tmp/pear/temp/oci8/oci8.c  -fPIC -DPIC -o .libs/oci8.o
In file included from /tmp/pear/temp/oci8/oci8.c:48:0:
/tmp/pear/temp/oci8/php_oci8_int.h:60:17: fatal error: oci.h: No such file or directory
compilation terminated.
make: *** [oci8.lo] Error 1
ERROR: `make' failed

Скрипт peclзапрашивает путь в начале установки, и вот здесь, я думаю, проблема:

Please provide the path to the ORACLE_HOME directory. Use 'instantclient,/path/to/instant/client/lib' if you're compiling with Oracle Instant Client [autodetect] :

Для продолжения установки вам нужно либо указать каталог ORACLE_HOME, либо нажать Enter. Я пробовал следующее, предложенное в другом месте, но это не работает - в выводе отсутствует перенос строки (по сравнению с запуском команды peclвручную), поэтому он не эмулирует Enterнажатие клавиши должным образом:

printf "\n" | pecl install oci8

Есть ли у вас какие-нибудь предложения, как заставить это работать правильно?

решение1

Моим решением было выполнить следующую команду:

export C_INCLUDE_PATH=/usr/include/oracle/11.2/client

и перезапустите:

pecl insatlla oci8

решение2

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

"pecl-install-oci8":
    command => "pecl install oci8",
    user => root,
    timeout => 0,
    tries   => 5,
    unless => "/usr/bin/php -m | grep -c oci8";

По какой-то причине, которую мне еще предстоит выяснить, puppet устанавливает oci8 без проблем.

И когда я это сделал, я перенес весь свой сценарий в манифест Puppet, но это не по теме.

решение3

Обычно для такого типа установки вы можете echo в параметрах, которые вы хотите установить. Я обернул весь оператор так, чтобы его можно было выполнить с разрешениями sudo

sudo sh -c "echo 'instantclient,/opt/oracle/instantclient' | pecl install oci8"

Связанный контент