suとechoを使用したZsh機能

suとechoを使用したZsh機能

私のファイルに新しいUSEフラグを追加しやすくする.zshrcために、ファイルに関数を追加したいと思います。/etc/portage/package.use普通は私がすべきこと

su -c 'echo "net-misc/aria2 bash-completion bittorrent" >> /etc/portage/package.use'

だから、次のような機能を作ってみました。

new_use() {
    su -c 'echo "$1" >> /etc/portage/package.use'
}

しかし、私はこれがうまくいかないことに気づきました。この機能を機能させる方法があるのか​​、それとも少なくともこの機能が適切なのか疑問に思います。しかし、この関数を呼び出すたびにルートパスワードを入力する必要があります。

答え1

次のようにroot権限でプログラムにstdinを提供できます。

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

関数のパラメータはデフォルトのシェルに渡されません。ルートシェルに渡される文字列のパラメータを置き換えることはできますが、文字列はsuルートシェルによって解析され、文字列の特殊文字が拡張されます。これらの追加の拡張(任意のコードがrootとして実行される可能性があります)を回避するには、一重引用符の間に文字列を挿入し(文字通り以外のすべての文字が'解釈されるように)、文字列から一重引用符文字を保護します('\''文字列リテラル終了)。 、一重引用符を追加して新しいリテラルを開始します。これは'\''、実際に一重引用符で区切られたリテラル内に一重引用符を入れる方法であることを意味します。

new_use() {
  su -c "echo '${1//\'/\'\\\'\'}' >> /etc/portage/package.use"
}

もう一つの可能​​なアプローチは使用tee

関連情報