在 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!