我试图区分这四个术语:登录,非登录,交互式和非交互式:
据我了解,
交互式-非登录Shell:启动系统,登录到系统并打开终端,并且
非交互式-登录Shell:通过telnet进入系统并登录
但是交互性-登录shell呢?
它是否登录到系统,打开虚拟终端并登录?并且
非交互-非登录外壳,它在crontab中运行自动化脚本吗?
您似乎唯一真正的误解是关于什么构成了非交互式登录外壳。
简要地(请参见此处以获取更多详细信息),并带有示例:
交互式登录外壳:例如,您通过登录到远程计算机ssh
。另外,您可以在本地计算机(Ctrl+ Alt+ F1)上的tty上登录。
交互式非登录外壳:打开一个新终端。
非交互式非登录外壳程序:运行脚本。所有脚本都在各自的子外壳中运行,并且该外壳不是交互式的。它仅会打开以执行脚本,并在脚本完成后立即关闭。
非交互式登录shell:这是非常罕见的,您不太可能遇到它。一种启动方式是echo command | ssh server
。如果ssh
在没有命令的情况下启动(ssh
而不是在远程外壳程序上ssh command
运行command
),它将启动登录外壳程序。如果stdin
of的ssh
不是tty,它将启动非交互式shell。这就是为什么echo command | ssh server
将启动非交互式登录Shell的原因。您也可以从开始bash -l -c command
。
如果您想解决这个问题,可以按如下所示测试各种类型的shell:
这个外壳是交互式的吗?
检查$-
变量的内容。对于交互式外壳,它将包括i
:
## Normal shell, just running a command in a terminal: interacive
$ echo $-
himBHs
## Non interactive shell
$ bash -c 'echo $-'
hBc
这是登录shell吗?
有没有可移植的方法检查这个,但是,对于bash,你可以检查login_shell
选项设置:
## Normal shell, just running a command in a terminal: interacive
$ shopt login_shell
login_shell off
## Login shell;
$ ssh localhost
$ shopt login_shell
login_shell on
综合所有这些,下面是每种可能的外壳类型之一:
## Interactive, non-login shell. Regular terminal
$ echo $-; shopt login_shell
himBHs
login_shell off
## Interactive login shell
$ bash -l
$ echo $-; shopt login_shell
himBHs
login_shell on
## Non-interactive, non-login shell
$ bash -c 'echo $-; shopt login_shell'
hBc
login_shell off
## Non-interactive login shell
$ echo 'echo $-; shopt login_shell' | ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell on
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句