Linux

bash 配置文件被讀取與“man bash”相矛盾

  • August 10, 2016

在嘗試確定和之間的差異時.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 別名,它可能已經安裝了……)。

引用自:https://unix.stackexchange.com/questions/62373