你試圖執行一個目錄,並且shell說不; bash通過說「/ db_backups:是一個目錄」表示否,而sh
表示「/ db_backups:權限被拒絕」。如果你只是執行backedticked部分:
grep '^datadir=' /etc/mysql/my.cnf | cut -f 2 -d '='
你幾乎肯定會看到任何輸出和原因可能是你的正則表達式是過於緊張,這樣的事情:
grep '^[ ]*datadir[ ]*=' /etc/mysql/my.cnf | cut -f2 -d'='
會更好地爲你服務;字符類包含一個空格和一個選項卡。
現在您正在尋找正確的事情,我們可以繼續探討爲什麼它仍然無法正常工作。 %x[]
quoter嘗試使用shell執行其參數。當你喂backticked grep的東西:
`grep '^[ ]*datadir[ ]*=' /etc/mysql/my.cnf | cut -f2 -d'='`/db_backups
的外殼,你應該得到與/db_backups
結尾的目錄名,但你不能執行的目錄。我想你想這個生產目錄名稱:
d = %x[echo `grep '^[ ]*datadir[ ]*=' /etc/mysql/my.cnf | cut -f2 -d'='`/db_backups].strip
注意龍頭echo
和.strip
呼叫返回的字符串。需要.strip
以從echo
生成的新行中刪除。
我認爲你正在經歷的東西很麻煩,可以很容易地使用Ruby的只是幾行完成:
dir = nil
File.open('/etc/mysql/my.cnf').each do |line|
if(m = line.match(/^\s*datadir\s*=\s*(\S+)/))
dir = m[1] + '/db_backups'
break
end
end
你也許可以擰緊了一點,如果你想,但我認爲這至少比在Ruby反引號中加入shell反引號更容易混淆。
你確定你的例子來自shell實際上工作嗎? 'bash:/ db_backups:是一個目錄'肯定有一種錯誤信息的味道。你想達到什麼目的?爲什麼整個命令在引號中? – sarnold 2011-03-28 05:56:45