所以我有以下标准脚本:
#!/bin/bash
PS3='Please enter your choice: '
options=("option 1" "Option 2" "Option 3" "Quit")
select opt in "${options[@]}"
do
case $opt in
"Option 1")
echo "you chose choice 1"
;;
"Option 2")
echo "you chose choice 2"
;;
"Option 3")
echo "you chose choice 3"
;;
"Quit")
break
;;
*) echo invalid option;;
esac
done
但是当我通过 SSH 运行脚本并选择“退出”选项时,SSH 也会退出。什么可能导致问题?我只想退出脚本并继续在 SSH 中工作。
问题出在我下面讨论的 .bash_aliases 文件中。我被放在exec
剧本之前。当我删除它并运行命令时,一切正常。
答案1
根据您所描述的行为,听起来您正在像这样运行脚本:
$ ssh remote picker.bash
例子
当我ssh
进入远程系统时,它会按预期工作,主要是脚本完成后我会保留在远程服务器上。
假设我有两台电脑,分别是远程电脑和笔记本电脑。我们将使用“L”表示lappy,使用“R”表示remotey。
L$ ssh remotey
R$ ./picker.bash
1) option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice: 4
R$
ssh
但是,如果我像这样运行脚本,我会得到您描述的终端消失的行为:
L$ ssh remotey ./picker.bash
1) option 1
2) Option 2
3) Option 3
4) Quit
Please enter your choice: 4
L$
答案2
您可以从选项 4 启动子 shell,但是当我使用“exec /bin/bash --login”尝试时,子 shell 的提示符丢失,导致远程 shell 有点难以使用。
ssh 的手册页似乎建议您可以运行 shell Xor 命令,但不能同时运行两者:
概要 ssh [许多选项] [用户@]主机名 [命令] ...
如果指定了 command,则它将在远程主机上执行,而不是在登录 shell 上执行。
...
当服务器接受用户的身份时,服务器要么执行给定的命令,要么登录到计算机并在远程计算机上为用户提供正常的 shell。
...
当远程计算机上的命令或 shell 退出时,会话终止
答案3
如果您运行,ssh remotehost somescript
那么脚本就会运行,仅此而已。如果不指定远程命令,您只能获得交互式 shell:交互式 shell 是默认的远程命令。当脚本退出时,远程会话结束。
如果您想在脚本之后运行交互式 shell,请告诉 SSH 您需要两者。添加该-t
选项,以便您在远程主机上获得终端:默认情况下,SSH 仅在您告诉它运行交互式 shell 时创建终端,而不是在您指定命令时创建终端。
ssh -t remotehost '/path/to/script; exec bash'
请注意,脚本中定义的任何环境变量将不可用。如果需要,请改为在远程 shell 中获取脚本。这还允许您从脚本关闭会话:exit
在脚本中不仅会退出脚本,还会退出整个远程会话,因为所有会话都在一个 shell 内运行。
ssh -t remotehost '. /path/to/script; exec bash'
答案4
问题出在 bash_aliases 中。我必须exec
在脚本之前删除。现在 bash_aliases 文件如下所示:
command="/path/to/script.sh"
这exec
会导致 SSH 退出会话。