sed 命令在终端中有效,但不能通过 bash_aliases 或 bash 脚本运行

sed 命令在终端中有效,但不能通过 bash_aliases 或 bash 脚本运行

每次 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

相关内容