Файлы конфигурации Bash читаются в противоречии с `man bash`

При попытке определить различия между .bashrc и .bash_profile я замечаю, что .bashrc никогда не читается и что .bash_profile считывается только из SSH, но не из PHP. Это, похоже, противоречит информации в man bash . Может ли кто-нибудь объяснить мне, почему это работает так, как оно есть? Кажется, что это вариант CentOS 5.

 local$ ssh user@server Last login: Wed Jan 23 23:21:23 2013 from 1.2.3.4 $ cat .bashrc alias br='echo fromBR' $ cat .bash_profile alias bp='echo fromBP' $ br -bash: br: command not found $ bp fromBP $ cat public_html/bashtest.php <?php echo "hello\n"; echo shell_exec('bp'); echo shell_exec('br'); ?> $ php public_html/bashtest.php hello sh: bp: command not found sh: br: command not found $ wget server/bashtest.php 23:35:13 (759.55 KB/s) - `bashtest.php' saved [7/7] $ cat bashtest.php hello! 

Таким образом, кажется, что .bashrc никогда не читается, и .bash_profile считывается только из CLI (не из PHP либо в CLI пользователя, ни через Apache). Кроме того, через Apache текст «команда не найден» даже не возвращается!

Является ли это ожидаемым поведением (т. Е. Я неверно истолковываю man bash ) или что-то не так?

Ну, для начала PHP не делает shell_exec через bash в вашем случае, он делает это через sh . Это довольно очевидно из точного сообщения об ошибке. Я предполагаю, что это контролируется какой-либо оболочкой, указанной в / etc / passwd для пользователя, на котором работает веб-сервер, а shell_exec не захватывает stderr, в сочетании с тем, что при запуске PHP из командной строки это просто выпадает до $ {SHELL}. При запуске как sh, bash отключает ряд функций, чтобы лучше имитировать поведение исходной оболочки sh. Поиск источников .bashrc и .bash_profile почти наверняка среди тех, если не по какой-либо другой причине, потому что эти файлы, вероятно, будут использовать синтаксис или расширения, связанные с bash.

Я не уверен в SSH-случае, но, судя по простой подсказке $ , вы вполне можете бегать через sh, что также объясняет поведение, которое вы видите. Попробуйте echo ${SHELL} чтобы увидеть, на что вы действительно попали; который должен работать на всех оболочках.

Тем не менее , мне кажется, что очень плохая идея зависеть от псевдонимов bash от скрипта PHP. Если то, что вы хотите сделать, слишком длинное, чтобы хорошо вписываться в shell_exec оператор shell_exec (который следует использовать исключительно осторожно), создавая функцию PHP для создания командной строки из параметров и вызова, что почти наверняка намного лучше подходит , и он будет работать практически независимо от того, какая оболочка установлена, выбрана или как она настроена. В качестве альтернативы рассмотрим вызов внешнего файла сценария, который можно записать в bash, и указать / bin / bash в качестве интерпретатора. Но тогда ваше приложение потребует установки bash (что, вероятно, уже выполняется, если это зависит от псевдонимов bash …).