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

5244
Samuel Lindblom

Я пытаюсь создать сценарий оболочки, который будет выполнять начальную подготовку vagrant vm (работает под управлением 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 

Любые предложения о том, как я могу заставить это работать должным образом?

3
Не могли бы вы попробовать `echo autodetect | pecl установить oci8`? GnP 10 лет назад 0
@gnp Я попробовал это, а также `printf" autodetect "`, не помогло. Samuel Lindblom 10 лет назад 0

3 ответа на вопрос

3
Phil Porada

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

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

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

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

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

pecl insatlla oci8 
1
Samuel Lindblom

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

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

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

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

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