我正在尝试向我的文件添加一个函数.zshrc
,以便/etc/portage/package.use
更轻松地向我的文件添加新的 USE 标志。通常情况下,我必须这样做
su -c 'echo "net-misc/aria2 bash-completion bittorrent" >> /etc/portage/package.use'
所以我尝试制作一个类似的函数
new_use() {
su -c 'echo "$1" >> /etc/portage/package.use'
}
但后来我意识到这是行不通的。我想知道是否有办法让这个函数起作用,或者至少函数是否适合这个。顺便说一句,我不介意每次调用该函数时都必须输入 root 密码。
答案1
您可以将 stdin 提供给具有 root 权限的程序,如下所示:
new_use() {
sudo tee -a /etc/portage/package.use <<< "$1" > /dev/null
}
答案2
只需反转引号即可。
new_use() {
su -c "echo '$1' >> /etc/portage/package.use"
}
这将导致$1
在执行之前被扩展su
。
答案3
函数的参数不会传递到底层 shell。您可以替换将传递给根 shell 的字符串中的参数su
,但请注意该字符串将由根 shell 进行解析,因此其中的特殊字符将被扩展。为了避免这种额外的扩展(这可能导致任意代码作为 root 执行),请在单引号之间插入字符串(这会导致除'
字面解释之外的所有字符),并保护字符串中的单引号字符('\''
终止字符串文字) ,附加一个单引号,并开始一个新的文字,这意味着这'\''
实际上是一种将单引号放在由单引号分隔的文字内的方法)。
new_use() {
su -c "echo '${1//\'/\'\\\'\'}' >> /etc/portage/package.use"
}
另一种可能的方法是使用tee
。