我试图区分这四个术语登录、非登录、交互式和非交互式:
据我了解
交互式-非登录shell:启动系统,登录系统并打开终端和
非交互式登录shell:telnet到系统并登录
但是交互式登录外壳呢?
它是否登录系统,打开虚拟终端并登录?和
非交互式 - 非登录 shell,它是否在 crontab 中运行自动脚本?
ter*_*don 67
您似乎唯一真正的误解是关于非交互式登录 shell 的构成。
简要(参见此处了解更多详细信息),并附上示例:
交互式登录 shell:您可以通过例如ssh. 另外,您也下降到一个tty本地计算机(上Ctrl+ Alt+ F1),并登录在那里。
交互式非登录 shell:打开一个新终端。
非交互式非登录 shell:运行脚本。所有脚本都在它们自己的子 shell 中运行,并且这个 shell 不是交互式的。它仅打开以执行脚本并在脚本完成后立即关闭。
非交互式登录shell:这是非常罕见的,您不太可能遇到它。一种启动方式是echo command | ssh server. 当ssh在没有命令的情况下启动时(ssh而不是在远程 shell 上ssh command运行command),它会启动一个登录 shell。如果stdin的ssh是不是一个TTY,它启动一个非交互的shell。这就是为什么echo command | ssh server会启动非交互式登录 shell。您也可以从bash -l -c command.
如果你想玩这个,你可以测试各种类型的 shell,如下所示:
这个 shell 是交互式的吗?
检查$-变量的内容。对于交互式 shell,它将包括i:
## Normal shell, just running a command in a terminal: interacive
$ echo $-
himBHs
## Non interactive shell
$ bash -c 'echo $-'
hBc
Run Code Online (Sandbox Code Playgroud)这是登录外壳吗?
有没有可移植的方法检查这个,但是,对于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
Run Code Online (Sandbox Code Playgroud)将所有这些放在一起,这是每种可能的外壳类型之一:
## 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
Run Code Online (Sandbox Code Playgroud)
mur*_*uru 10
从本质上讲,shell 是否登录、交互与否很重要,原因只有一个:
相应地,shell 是登录与否或交互与否完全取决于所使用的调用- 确切的命令名称和选项。
这两个属性是正交的——shell 是否登录与确定它是否交互无关。
如果其中任何一个为真,Bash 将启动一个登录 shell:
argv[0],它被调用的命令的名称,以 --l选项已指定类似地,如果其中任何一个为真,bash 将启动一个交互式 shell:
bash some/file)或要运行的命令字符串(bash -c 'foo')(实际情况有点复杂,请参阅手册)-i选项已指定值得注意的是(并且矛盾的是),后者意味着bash -ic 'foo'启动一个交互式 shell。
因此,以下启动了一个登录的交互式 shell,即使它没有任何交互性并且调用与登录无关:
bash -lic true
Run Code Online (Sandbox Code Playgroud)
通过控制台或 GUI 登录启动登录 shell(或可能不启动)完全是使用适当调用的登录过程的结果。
bash 手册中有关启动文件的部分详细描述了条件和效果。
一个主要的混淆来源是“登录”shell 有另一个常见的含义:
用户的登录 shell 是在该用户的passwd条目中定义的 shell (可能来自/etc/passwd、LDAP 或其他一些来源)。
该login程序,SSH等启动这个shell作为登录在回答其余意味着感壳-以领先-的命令名称,通常。如果你想特别混乱,你可以说:
某些登录进程将用户的登录 shell 作为登录 shell 启动。
请注意,GUI 登录启动登录 shell 纯粹是因为开发人员认为它很方便 - LightDM 在登录时运行一个脚本,这显然不是交互式的,当然不依赖于用户的登录 shell(在第二种意义上)。不过,不要依赖于显示管理器启动登录 shell - 并非所有人都这样做,并且在 Wayland 和 GNOME 上,登录过程根本不使用 shell 脚本。