Basta inverter as aspas.
new_use() {
su -c "echo '$1' >> /etc/portage/package.use"
}
Isso fará com que $1
seja expandido antes da execução de su
.
Estou tentando adicionar uma função ao meu .zshrc
que facilita a adição de novos sinalizadores de USE ao meu arquivo /etc/portage/package.use
. Normalmente, eu teria que fazer
su -c 'echo "net-misc/aria2 bash-completion bittorrent" >> /etc/portage/package.use'
Então, tentei criar uma função como
new_use() {
su -c 'echo "$1" >> /etc/portage/package.use'
}
mas depois percebi que não funcionaria. Eu quero saber se há uma maneira de fazer essa função funcionar, ou pelo menos se as funções são apropriadas para isso. By the way, não me importo de ter que digitar a senha de root toda vez que eu chamo a função.
Você pode alimentar stdin para um programa com privilégios de root, assim:
new_use() {
sudo tee -a /etc/portage/package.use <<< "$1" > /dev/null
}
O argumento da função não é passado para o shell subjacente. Você pode substituir o argumento dentro da string que su
irá passar para o shell de root, mas tenha cuidado que a string será analisada pelo shell de root, então caracteres especiais serão expandidos. Para evitar essa expansão extra (que pode fazer com que um código arbitrário seja executado como root), interpole a string entre aspas simples (o que faz com que todos os caracteres diferentes de '
sejam interpretados literalmente) e proteja aspas simples na string ( '\''
termina o literal da string, acrescenta uma aspa simples e inicia um novo literal, o que significa que '\''
é efetivamente uma maneira de colocar uma aspa simples dentro de um literal delimitado por aspas simples).
new_use() {
su -c "echo '${1//\'/\'\\'\'}' >> /etc/portage/package.use"
}
Outra abordagem possível é usar tee
.
Tags zsh shell-script quoting