2011-12-29 21 views
0

我正在編寫一個shell腳本,並希望將STDOUT管道傳輸到su命令中的文件中。輸出的文件需要由另一個用戶擁有,因此使用su。但是,當要輸出的文本和輸出文件的名稱是變量(請參見下面的示例)時,我無法使用管道工作。su和具有變量的管道

我的解決方法是管到一個文件,而無需使用蘇,然後CHOWN該文件到我需要的用戶。但是,我想知道是否有一個使用su執行此操作的「單步」方法?

示例(僅供說明之用):

#!/bin/sh 

message="Hello World"; 
file="/tmp/HelloWorld.txt"; 

su someuser -c 'echo "${message}" > "${file}"'; 

如果我把${file}在雙引號,因爲在這個例子中,我得到以下錯誤:

bash: : No such file or directory 

如果我刪除雙 - 引用約爲${file},出現以下錯誤:

bash: ${file}: ambiguous redirect 
+0

輝煌 - 它的作品!這麼快的回覆,非常感謝! – Francis 2011-12-29 10:03:46

+0

你「重定向」到一個文件,「管道」到一個進程。常規文件不是管道。 – 2011-12-29 14:36:13

回答

1

嘗試su someuser -c "echo \"${message}\" > ${file}";

單引號內不會擴展變量。

+0

是的,thx v很多,這很好! – Francis 2011-12-29 10:27:05

+0

請注意,您並不需要這些轉義雙引號,因此通過刪除它們(例如[c]「echo $ message> $ file」)來使代碼看起來更好一些。 – dimir 2011-12-29 12:43:11

+0

@dimir,一般​​來說,你需要它們,或者你需要把參數放在單引號中(這也可以起作用)。考慮調用'rm'或任何其他命令而不是'echo'。不用引用,當你想要一個單獨的參數'Hello World'時,'rm'會被兩個參數'Hello'和'World'調用。 – khachik 2011-12-29 13:02:59