だから、次の標準スクリプトがあります。
#!/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
リモートシステムに接続すると、期待どおりに機能します。主にスクリプトが完了した後もリモートサーバーに残ります。
リモートコンピュータとラップトップという2台のコンピュータがあるとしましょう。ラッピーには「L」を、リモートには「R」を使用します。
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でサブシェルを起動できますが、「exec /bin/bash --login」で試したときにサブシェルのプロンプトが失われ、リモートシェルを使用するのが少し難しくなりました。
sshのマニュアルページでは、シェルXorコマンドを実行できますが、同時に両方を実行することはできないことを示唆しているようです。
概要 ssh [様々なオプション] [ユーザー@]ホスト名[コマンド] ...
コマンドを指定すると、ログインシェルではなくリモートホストで実行されます。
...
サーバがユーザのアイデンティティを受け入れると、サーバは与えられたコマンドを実行するか、コンピュータにログインし、ユーザにリモートコンピュータの汎用シェルを提供する。
...
リモートシステムのコマンドまたはシェルが終了すると、セッションは終了します。
答え3
実行するとssh remotehost somescript
スクリプトが実行され、それがすべてです。リモートコマンドを指定しないと、対話型シェルのみが取得されます。対話型シェルがデフォルトのリモートコマンドです。スクリプトが終了すると、リモートセッションは終了します。
スクリプトの後にインタラクティブシェルを実行したい場合は、両方ともSSHに通知してください。-t
リモートホストに端末をインポートするには、このオプションを追加してください。デフォルトでは、SSHはコマンドを指定するのではなく、対話型シェルを実行するように指示したときにのみ端末を生成します。
ssh -t remotehost '/path/to/script; exec bash'
スクリプトで定義された環境変数は使用できません。必要に応じて、リモートシェルからスクリプトをインポートします。これにより、スクリプトでセッションを閉じることができます。exit
スクリプトが終了するだけでなく、すべてのセッションがシェル内で実行されるため、リモートセッション全体が終了します。
ssh -t remotehost '. /path/to/script; exec bash'
答え4
問題はbash_aliasesにあります。exec
スクリプトの前に削除する必要があります。 bash_aliasesファイルは次のようになります。
command="/path/to/script.sh"
これexec
により、SSH はセッションを終了します。