Zsh 函数与 su 和 echo

Zsh 函数与 su 和 echo

我正在尝试向我的文件添加一个函数.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

相关内容