2015-12-15 96 views
0

我在PHP中遇到了shell_exec()函數的一個有趣的情況。此命令的工作:PHP shell_exec()命令中引號的用法

$res = shell_exec("mdb-export -D \"%d/%m/%y\" ".$this->mdbFileName." ".$tableName." &> " . $outputFile); 

但是,此命令不起作用:

$res = shell_exec("mdb-export -D \"%d/%m/%y\" ".$this->mdbFileName." \"".$tableName."\" &> " . $outputFile); 

當一個shell輸入命令(無論哪種方式 - 帶或不帶周圍的表名引號),它工作正常。我真的想知道爲什麼第一套逃脫的報價並不影響了shell_exec():

\"%d/%m/%y\" 

但第二組:

\"".$tableName."\" 

不允許了shell_exec執行。僅供參考:腳本中的所有文件名變量均爲完整文件路徑。在殼體中進行測試時,它們以完全相同的方式輸入。有什麼想法嗎?

編輯:失敗後,shell_exec返回NULL並且不執行命令。

+0

不僅僅是說它不起作用,而是提供錯誤信息或進一步瞭解實際問題。 – Devon

+0

嗨德文,沒有錯誤信息。 shell_exec()返回NULL並且不執行該命令。我將編輯我的帖子以反映這一點。 – user2395126

+1

嘗試在沒有重定向的情況下回顯它。 shell_exec(「echo mdb-export ...」);看看實際執行的是什麼。 – Devon

回答

0

經過一些更多的測試後,看起來$ tableName變量包含一個額外的空間。該程序的另一部分是從MDB文件中提取表名並留下尾部空格。

當回顯$ tableName變量時,一切都顯得很好,因爲空間是不可見的。當運行shell_exec時沒有圍繞表名稱的引號時,執行該命令是因爲如果參數之間有額外的空格則不會發生錯誤。然而,與周圍的報價變量時,該MDB-出口計劃開始尋找:中

"tableName " 

代替

"tableName" 

造成了沉默,但完全失敗。