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 讀取(不是從使用者的 CLI 上的 PHP 或通過 Apache 讀取)。此外,通過 Apache,甚至沒有返回“找不到命令”文本!這是預期的行為(即我誤解
man bash
了)還是有問題?
好吧,首先,在您的情況下,PHP 並沒有
shell_exec
通過bash
,而是通過sh
. 從確切的錯誤消息中可以看出這一點。我猜這是由 /etc/passwd 中為執行 Web 伺服器的使用者指定的任何 shell 控制的,並且 shell_exec 不會擷取 stderr,結合從命令行執行 PHP 時它只是退出${SHELL}。當作為 sh 啟動時,bash 會關閉許多功能以更好地模仿原始 sh shell 的行為。如果沒有其他原因,那麼幾乎可以肯定是這些文件的來源,因為這些文件可能使用特定於 bash 的語法或擴展名.bashrc
。.bash_profile
我不太確定 SSH 案例,但從簡單的
$
提示來看,你很可能在 sh 那裡執行,這同樣可以解釋你所看到的行為。試著echo ${SHELL}
看看你真正陷入了什麼;這應該適用於所有貝殼。也就是說,在我看來,依賴 PHP 腳本中的 bash 別名是一個非常糟糕的主意。如果您想要做的事情太長而不能很好地適應
shell_exec
語句本身(應該非常小心地使用),那麼創建一個 PHP 函式來從參數創建命令行並呼叫這幾乎肯定是一個更好的方法,無論安裝、選擇哪個外殼或如何配置它,它基本上都可以工作。或者,考慮呼叫外部腳本文件,該文件可以用 bash 編寫並指定 /bin/bash 作為其解釋器。但是你的應用程序將需要安裝 bash(如果它依賴於 bash 別名,它可能已經安裝了……)。