有没有办法根据用户指定使用哪个shell?
Is there a way to designate which shell to use depending on the user?
在这种情况下,我有一个由两个用户共享的脚本。一个用户使用 bash 另一个用户使用 zsh。我需要此脚本根据登录用户使用 bash 或 zsh。例如:
#!/bin/bash if user1
#!/bin/zsh if user2
实际如何实施?
更好的是,是否只有当特定用户正在执行脚本时才使用某个 shell 默认值?大致如下:
if user1
then
#!/bin/bash
else
#!/bin/zsh
fi
您可以创建一个包装脚本来检查 $UID,然后调用所需脚本的正确版本。
没有充分的理由这样做。然而:
#!/bin/sh
if [ -z "$shell_selected" ]; then
case "$(id -u)" in
user1) export shell_selected=1; exec zsh "[=10=]" "$@" ;;
user2) export shell_selected=1; exec bash "[=10=]" "$@" ;;
fi
fi
# ...script contents here...
重要的是:
- 为了防止我们自己陷入无限循环,我们导出一个环境变量,然后用不同的shell重新执行我们自己,并且只有在以下情况下才重新执行该环境变量未设置。
- 要实际更改 shells,我们使用
exec
调用,它用不同的程序替换我们的 process-table 条目。
不过,再说一遍:绝对没有理由这样做,而且有很多理由不这样做。您的用户每个 运行 脚本都可以使用不同于其本机配置 shell 的 shebang,就像用户可以 运行 Python 脚本一样,即使他们的本机 shell将 永远不会 成为 Python -- shebang 行控制解释器。
在这种情况下,我有一个由两个用户共享的脚本。一个用户使用 bash 另一个用户使用 zsh。我需要此脚本根据登录用户使用 bash 或 zsh。例如:
#!/bin/bash if user1
#!/bin/zsh if user2
实际如何实施?
更好的是,是否只有当特定用户正在执行脚本时才使用某个 shell 默认值?大致如下:
if user1
then
#!/bin/bash
else
#!/bin/zsh
fi
您可以创建一个包装脚本来检查 $UID,然后调用所需脚本的正确版本。
没有充分的理由这样做。然而:
#!/bin/sh
if [ -z "$shell_selected" ]; then
case "$(id -u)" in
user1) export shell_selected=1; exec zsh "[=10=]" "$@" ;;
user2) export shell_selected=1; exec bash "[=10=]" "$@" ;;
fi
fi
# ...script contents here...
重要的是:
- 为了防止我们自己陷入无限循环,我们导出一个环境变量,然后用不同的shell重新执行我们自己,并且只有在以下情况下才重新执行该环境变量未设置。
- 要实际更改 shells,我们使用
exec
调用,它用不同的程序替换我们的 process-table 条目。
不过,再说一遍:绝对没有理由这样做,而且有很多理由不这样做。您的用户每个 运行 脚本都可以使用不同于其本机配置 shell 的 shebang,就像用户可以 运行 Python 脚本一样,即使他们的本机 shell将 永远不会 成为 Python -- shebang 行控制解释器。