好的,首先,我知道这个问题在这里已经被问过几次了,但是给出的答案并不完全让我满意。情况如下:我编写了许多脚本来自动化各种维护任务,目的是完全自动化并且一旦开始就不需要交互。现在,各种任务(例如安装内容等)通常需要 root 权限,但更多时候我不喜欢使用超级用户权限执行命令或整个块(例如 wget,或提取从网络获取的存档等),在最坏的情况下限制损坏。显然,为了满足我的目标,必须根据命令使用sudo
或调用脚本su
并删除特权并重新获得它们。
现在我已经考虑了一些选择,但它们并没有完全让我满意,因此我想咨询这里的专家,以了解哪个是最好的解决方案(目的是代码易于理解并且对其他人也具有逻辑结构一旦发布):
1.) 将要以非 root 用户身份执行的位分解到外部文件中,并使用su <user> -c /path/to/file
. 然而,这种方法有两个缺点:首先,它破坏了脚本的逻辑结构,使事情更难理解和阅读,并在定义和使用变量时产生问题。
2.) 定义别名或函数来缩短su <user> -c "command"
. 这是一个非常糟糕的主意,因为 80% 的脚本都具有该特权前缀。除此之外,多行命令是有问题的(比如包含我不想以 root 身份运行的命令的结构)。
3.) 类似的东西su <user> << EOF << ... EOF
可以正确处理整个代码块。如果没有一个问题困扰我,这将是最优雅的解决方案(因为脚本的逻辑结构没有被破坏):语法高亮。我尝试过的所有主要编辑器都对 here 文档中的整个块使用一种颜色。通读一个 80% 没有语法突出显示的脚本并不是很好。
有没有真正优雅的方法来处理这个问题?su <user> -c ( ...)
没有引号的东西会很酷。或者我应该切换到另一个shell?(现在我使用 bash,我听说 zsh 有一个功能可以设置 EUID 变量或类似的东西?)如果没有优雅的解决方案,哪种方法更可取?
我正在寻找一种结合了这两个命令的优雅解决方案:
sed -i '/Y/! s/replace/with/' /path/to/file
sed -i '/X/ s/replace/with/' /path/to/file
Run Code Online (Sandbox Code Playgroud)
我试过
sed -i '/X/ /Y/! s/replace/with/' /path/to/file
Run Code Online (Sandbox Code Playgroud)
这不起作用。有没有一个优雅的解决方案?