【问题标题】:Change shell in shell script when running in sudo在 sudo 中运行时更改 shell 脚本中的 shell
【发布时间】:2021-06-11 12:28:19
【问题描述】:

我的简单 shell 脚本如下所示

test.sh

#!/bin/zsh
echo $SHELL

当我运行命令sh test.sh 时,结果是/bin/zsh

当我运行命令sudo sh test.sh 时,结果是/bin/bash

我想用sudo 运行这个脚本并且需要shell 是zsh。有人可以帮忙吗?

【问题讨论】:

  • sudo /bin/zsh test.sh ?
  • 就我而言,zsh 位于/usr/bin/zsh。上面带有#!/usr/bin/zsh 的代码的输出是#!/usr/bin/zsh。你可以检查一下。
  • 正如已删除的答案指出的那样,$SHELL 不是当前的 shell。这是你的登录外壳。
  • 如果你需要执行带有zsh的脚本,那么不要使用shsudo /bin/zsh test.sh 或使脚本可执行 (chmod +x test.sh) 并使用 sudo ./test.sh 执行它。
  • /bin/zsh test.sh 没有任何意义,因为脚本应该采用脚本中提到的外壳。好吧,经过几次点击和尝试,我发现我没有将 zsh 设置为超级用户的默认值。之后,我的脚本也将 zsh 置于 sudo 模式。

标签: zsh


【解决方案1】:

#!/bin/zsh 告诉操作系统,当您的脚本作为可执行文件启动时,它应该使用zsh 来运行它。这在您完成chmod a+x test 然后通过键入运行您的脚本时发生

test.sh

当你这样做时

sh test.sh

然后您将脚本直接传递给sh,而 shebang 将被忽略。


echo $SHELL 确实打印当前的shell,而只是当前用户的login shell。对你来说,显然是zsh,但对于超级用户来说,显然是bash。不过,这再次说明了运行脚本的 shell。


要在zsh 中使用sudo 运行您的脚本,只需这样做

sudo test.zsh

或者,无论您在文件中有什么shebang,您都可以通过执行强制脚本在zsh 中运行

sudo zsh test.zsh

【讨论】:

  • 这是有道理的。谢谢
相关资源