每次 Vivaldi 更新时,我都必须运行此 sed 命令来应用 custom.css
sudo sed -i '1s/^/@import "custom.css";/' /opt/vivaldi-snapshot/resources/vivaldi/style/common.css
现在,该命令在终端中可以正常工作,但当我尝试通过在 ~/.bash_aliases 中创建别名或甚至通过 bash 脚本(放置在具有可执行权限的 /bin/ 内)来运行它时,它却无法正常工作。我尝试使用“custom.css”的完整路径,但仍然不起作用。谢谢。
编辑:
(1)通过别名:
alias vivupdate="sed -i '1s/^/@import "custom.css";/' /opt/vivaldi-snapshot/resources/vivaldi/style/common.css"
当我尝试运行时,出现此错误:
$ sudo vivupdate
[sudo] password for admn:
sudo: vivupdate: command not found
$
(2)通过 Bash 脚本:
#!/bin/bash
sed -i '1s/^/@import "custom.css";/' /opt/vivaldi-snapshot/resources/vivaldi/style/common.css
创建 vivupdate.sh,使其可执行并将其放在 /bin/ 中。
然后编辑 sudoers 文件并添加:
user ALL=(ALL:ALL) NOPASSWD:/bin/vivupdate.sh
但是当我在终端中运行脚本时,出现此错误:
sed: couldn't open temporary file /opt/vivaldi-snapshot/resources/vivaldi/style/sedCIt48u: Permission denied
答案1
别名不适用于sudo
。它们特定于您的 shell 和用户,并且sudo
正在以 root 身份运行命令。因此,如果您需要以 root 身份运行别名,则需要sudo
在别名定义本身中包含 。此外,您对别名的引用有误,因此无论如何它都不起作用。您想要的是:
alias vivupdate="sudo sed -i '1s/^/@import \"custom.css\";/' /opt/vivaldi-snapshot/resources/vivaldi/style/common.css"
注意我如何转义内部双引号 ( \"
)。如果没有它,由于您使用双引号定义别名,因此第二个双引号( 之前的那个"custom.css
)将表示结束。
脚本的问题在于其sed -i
行为方式。虽然它似乎在编辑原始文件,但实际上它会将编辑后的文件保存为临时副本,然后将文件重命名为原始文件。但是,由于您没有使用 运行它sudo
,因此您无权这样做。您添加到sudoers
文件中的行仅表示您可以sudo vivupdate.sh
在没有密码的情况下运行它。但是,您仍然需要以 的身份运行它sudo
。
仅将命令添加到是不够的sudoers
,您仍然需要使用以下命令调用它sudo
:
sudo /bin/vivupdate.sh