2011-03-28 76 views
1

從ruby控制檯執行shell命令時獲取權限被拒絕錯誤。 並且shell正在運行相同的shell命令。從ruby控制檯執行shell命令返回權限被拒絕錯誤?

從殼牌..

[email protected]:~$ "`grep '^datadir=' /etc/mysql/my.cnf | cut -f 2 -d '='`/db_backups" 
bash: /db_backups: is a directory 
[email protected]:~$ 

從Ruby控制檯..

>> %x["`grep '^datadir=' /etc/mysql/my.cnf | cut -f 2 -d '='`/db_backups"] 
sh: /db_backups: Permission denied 
=> "" 

任何想法!

+0

你確定你的例子來自shell實際上工作嗎? 'bash:/ db_backups:是一個目錄'肯定有一種錯誤信息的味道。你想達到什麼目的?爲什麼整個命令在引號中? – sarnold 2011-03-28 05:56:45

回答

2

你試圖執行一個目錄,並且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反引號更容易混淆。

+0

優秀的水晶球工作,以及很好的答案。 – sarnold 2011-03-28 08:40:05

+1

@sarnold:感謝鄰居,西海岸最好的海岸。 – 2011-03-28 17:00:16

0

它看起來像你只是想從文件中獲得字段2。然後在Ruby中使用拆分來做到這一點

File.open("file").each do |line| 
    if line[/^datadir/] 
    print line.split("=",2)[0] 
    end 
end 

沒有必要專門去調用grep。這是效率低下,不可移植的