Bash 構成ファイルの読み取りは、「man bash」と矛盾します。

Bash 構成ファイルの読み取りは、「man bash」と矛盾します。

.bashrcとの違いを確認しようとしている間に、PHPではなくSSHでのみ読み込まれていない.bash_profileことがわかりました。これはの情報と矛盾するようです。なぜこれが起こるのか説明できますか?サーバーがCentOS 5バリアントのようです。.bashrc.bash_profileman bash

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!

したがって、CLIでのみ.bashrc読み取られないようです(ユーザーCLIのPHPやApacheを介しては読み取れません)。.bash_profileまた、Apacheを通じて「コマンドが見つかりません」というテキストも返されません!

これが予想される動作ですか(つまり、私が間違って理解しているのですかman bash?)それとも何か間違っていますか?

答え1

まず、PHPはあなたの例ではこれを行いません。shell_execこれは正確なエラーメッセージで非常に明白です。はいbashsh推測するこれは、Webサーバーを実行しているユーザーとして/ etc / passwdで指定されたシェルによって制御され、shell_execはstderrをキャプチャせず、コマンドラインからPHPを実行すると$ {shellで終了します。 }。 shで始まると、bashは元のshシェルの動作をよりよく模倣するために多くの機能をオフにします。他に理由がなければ、.bashrcこれらのファイルのソースはほとんど間違いなく.bash_profileそれらの1つです。これらのファイルは bash 固有の構文または拡張を使用できるためです。

SSHについてはわかりませんが、簡単な$ヒントでshを実行している可能性が高く、これは現在見ている動作を説明します。echo ${SHELL}実際に何が付いているか確認してください。これはすべてのシェルで動作します。

その意味は、私の考えでは、PHPスクリプトでbashエイリアスに頼ることは非常に悪い考えです。実行する作業が長すぎてステートメントshell_exec自体に適していない場合(非常に慎重に使用する必要がある場合)、引数でコマンドラインを生成するPHP関数を生成し、それを呼び出すことはほぼ確実に良い方法です。それはうまくいくでしょうにもかかわらず選択するシェルまたは構成方法をインストールします。あるいは、bashで作成し、そのインタープリターで/ bin / bashを指定できる外部スクリプトファイルを呼び出すことを検討してください。ただし、アプリケーションはbashのインストールを要求します(bashエイリアスに依存している場合はすでにインストールされている可能性があります...)。

関連情報