2016-04-18 24 views
1

比方說,我有以下這裏文檔(這是用來啓用Ubuntu的休眠):如何在傳遞給Bash的字符串中使用Bash變量?

IFS= read -d '' text << "EOF" 
[Re-enable hibernate by default in upower] 
Identity=unix-user:* 
Action=org.freedesktop.upower.hibernate 
ResultActive=yes 

[Re-enable hibernate by default in logind] 
Identity=unix-user:* 
Action=org.freedesktop.login1.hibernate 
ResultActive=yes 
EOF 

我的方式在受保護的文件,該文本存儲類似如下:

echo "${text}" | sudo tee /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla 

我怎麼能做一個類似的操作使用bash變量在一個命令字符串(這是使用重定向運算符)傳遞給根下運行的Bash?

sudo bash -c 'echo "${text}" > /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla' 

在Bash的新實例中,變量顯然不存在。

+0

不它的工作如果你說'sudo bash -c「echo \」$ text \「>/etc/....」'?它適用於這些雙引號。 – fedorqui

+0

在'sudo'中不運行'echo'看起來對我來說是最好的解決方案。 – tripleee

回答

1

一種選擇是將變量作爲參數傳遞,就像這樣:

sudo bash -c 'printf "%s\n" "$0" > /path/to/output' "$text" 
+0

非常好!我不知道這可以完成 - 然後,我想知道它是否會以'$ 1'開始。但不,第一個是'$ 0'。 – fedorqui

+0

@fedorqui看起來這種行爲在過去有所不同,但'$ 0'是POSIX標準。請參閱[此問題](http://unix.stackexchange.com/q/152391/67817)進行相關討論。 –

+1

可以說,正確的做法是將一個虛擬(甚至是空的)值傳遞給'bash'來保留'$ 1'是腳本的第一個位置參數的語義:'bash -c'...'「make_output 「」$ text「'或'bash -c'...'」「」$ text「'。 (這實際上取決於你發現哪個更加震撼;'$ 0'用作位置參數,或者''看似沒有用到'bash'的參數。) – chepner

0

text變量在新的bash環境中沒有更多的定義,這就是它失敗的原因。

下面這個命令已經測試OK,不妨一試:

sudo bash -c 'cat > /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla' <<<"${text}"