如何使用 sudo 简单地将包含 $HOME 的文本重定向到 /etc/zshenv?

问题描述

我想要一个脚本来为我的 .zshrc 文件设置一个更好(但非认)的位置:

% sudo echo "ZDOTDIR=$HOME/.config/zsh" >> /etc/zshenv

但这失败了:

zsh: permission denied: /etc/zshenv

该问题与首先进行的重定向有关,但没有明显的方法可以解决此问题。我可以听到您说“使用 zsh -c”,但失败了:

sudo zsh -c 'echo "ZDOTDIR=$HOME/.config/zsh" >> /etc/zshenv'

导致 $HOME 在用 sudo 启动的 shell 内被评估,所以我的 /etc/zshenv 文件包含

ZDOTDIR=/var/root/.config/zsh

相信我:我的主目录不是 /var/root

我试过 --preserve-env 但没有用:

sudo --preserve-env zsh -c 'echo "ZDOTDIR=$HOME/.config/zsh" >> /etc/zshenv'

显然我可以找到一种解决方法,例如将 $HOME 保存到脚本中的局部变量,但似乎必须有一种更直接、更简单和直接的方法来做到这一点。

解决方法

我刚刚意识到我在想这个问题全错了。我想防止 $HOME 被评估。当然,在单引号内转义单引号是一种新的 PITA,但它是:

sudo zsh -c 'echo '"'"'ZDOTDIR=$HOME/.config/zsh'"'"' >> /etc/zshenv'