在 shell 脚本中执行用户默认 shell

在 shell 脚本中执行用户默认 shell

在 shell 脚本中,我想执行用户 shell 并在 shell 完成后继续执行脚本。

它应该看起来像这样:

> myScript.sh
Script ouput
> echo "shell started by myScript.sh"
shell started by myScript.sh
> exit
More script output
>

当我在脚本中执行 shell 时它会起作用:

echo "Script output"
bash
echo "More script output"

但我希望它不要使用固定外壳。用户登录 shell 或他启动 myScript.sh 之前所在的 shell 应该没问题。

任何解决方案不仅必须适用于基于 Linux 的系统,而且还必须适用于 Mac OSX

答案1

您可以使用$SHELL环境变量(如果已设置)

echo "Script output"
"${SHELL-bash}"
echo "More script output"

在这种情况下,如果未设置,代码将调用bash.

我还没有检查它是否指向有效的可执行文件,假设如果有人摆弄它,它们也会影响相当多的其他应用程序,但由于它应该是完整路径,因此您可以使用这种类型的方法(未经测试)

[ -n "$SHELL" ] && [ -x "$SHELL" ] || SHELL=
"${SHELL-bash}"

答案2

初始登录 shell 保存在 passwd 数据库中,因此您可以按照$(getent passwd myusername | cut -d: -f7).请注意,如果我通常使用zsh,但当前处于 a 状态bash并运行它,我将得到 azsh而不是 a bash,这可能是也可能不是您想要的?

答案3

环境变量$$指的是当前的PID。我们可以将其与“ps”一起使用来查找当前的 shell:

ps --no-header -o args -p $$ | cut -d- -f2

上面应该返回你想要的内容,修剪可能存在的前导。例如:

THESHELL=`ps --no-header -o args -p "$$" | cut -d- -f2`
start_another_shell() {
    "$THESHELL"
}
echo "The shell is $THESHELL"
start_another_shell
echo "Bye!"

确保使用“源”运行它,以避免意外地叉轰炸自己。例如:

me@here$ source myScript
The shell is bash
me@here$ exit
Bye!
$ zsh
$ source myScript
The shell is zsh
$ exit
Bye!

相关内容