質問: ログインシェルと非ログインシェルの違いは何ですか? インタラクティブシェルと非インタラクティブシェルの基本的な違いを理解しています。しかし、ログインシェルと非ログインシェルを正確に区別するものは何ですか?非ログインインタラクティブシェルの使用例を教えていただけますか?
回答: gillesのすばらしい回答と、ログインシェルタイプを確認するためのtimothyの方法を組み合わせて詳しく説明します。自分で確認したい場合は、以下のスニペットとシナリオを試してください。シェルが(非)インタラクティブかどうかを確認していますif tty -s; then echo 'this is interactive shell.'; else echo 'this is non-interactive shell.'; fi シェルが(非)ログインであるかどうかの確認echo $0の出力が-で始まる場合、それはログインシェルです(echo $0出力例:-bash)。それ以外の場合は、非ログインシェルです(echo $0出力例:bash)。if echo $0 | grep -e ^\- 2>&1>/dev/null; then echo "this is login shell."; else echo "this is non-login shell."; fi; 上記の2つを組み合わせて、両方の情報を一度に取得します。this_shell_interactive_type='non-interactive'; this_shell_login_type='non-login'; if tty -s; then this_shell_interactive_type='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then this_shell_login_type='login'; fi; echo "$this_shell_interactive_type/$this_shell_login_type" シナリオ:特別なオプションなしの典型的なsshセッションssh ubuntu@34.247.105.87 welcome to ubuntu 16.04.5 lts (gnu/linux 4.4.0-1083-aws x86_64) ubuntu@ip-172-31-0-70:~$ this_shell_interactive_type='non-interactive'; ubuntu@ip-172-31-0-70:~$ this_shell_login_type='non-login'; ubuntu@ip-172-31-0-70:~$ if tty -s; then this_shell_interactive_type='interactive'; fi; ubuntu@ip-172-31-0-70:~$ if echo $0 | grep -e ^\- 2>&1>/dev/null; then this_shell_login_type='login'; fi; ubuntu@ip-172-31-0-70:~$ echo "$this_shell_interactive_type/$this_shell_login_type" interactive/login スクリプトの実行または新しいシェルを介した明示的な実行ubuntu@ip-172-31-0-70:~$ bash -c 'this_shell_interactive_type='non-interactive'; this_shell_login_type='non-login'; if tty -s; then this_shell_interactive_type='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then this_shell_login_type='login'; fi; echo "$this_shell_interactive_type/$this_shell_login_type"' interactive/non-login ローカルスクリプトをリモートで実行するssh ubuntu@34.247.105.87 < checkmy.sh pseudo-terminal will not be allocated because stdin is not a terminal. welcome to ubuntu 16.04.5 lts (gnu/linux 4.4.0-1083-aws x86_64) non-interactive/login sshを介してリモートでコマンドを実行するssh ubuntu@34.247.105.87 'this_shell_interactive_type='non-interactive'; this_shell_login_type='non-login'; if tty -s; then this_shell_interactive_type='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then this_shell_login_type='login'; fi; echo "$this_shell_interactive_type/$this_shell_login_type"' non-interactive/non-login -tスイッチを使用してssh経由でリモートでコマンドを実行する-tスイッチを使用してssh経由でリモートでコマンドを実行する場合は、インタラクティブシェルを明示的に要求できます。ssh ubuntu@34.247.105.87 -t 'this_shell_interactive_type='non-interactive'; this_shell_login_type='non-login'; if tty -s; then this_shell_interactive_type='interactive'; fi; if echo $0 | grep -e ^\- 2>&1>/dev/null; then this_shell_login_type='login'; fi; echo "$this_shell_interactive_type/$this_shell_login_type"' interactive/non-login 注:コマンドをリモートで実行することがlogin shellではない理由についての詳細 ここ 。