我知道交互式/非交互式外壳程序和登录/非登录外壳程序之间有什么区别,但是在实践中似乎永远不会有非交互式登录外壳程序,除非您/bin/bash --login some-script.sh在脚本中有类似的东西(甚至看起来有点奇怪)。这是正确的还是更常见?
我知道交互式/非交互式外壳程序和登录/非登录外壳程序之间有什么区别,但是在实践中似乎永远不会有非交互式登录外壳程序,除非您/bin/bash --login some-script.sh在脚本中有类似的东西(甚至看起来有点奇怪)。这是正确的还是更常见?
Answers:
我假设您正在谈论Bash的登录vs.非登录以及交互式vs.非交互式Bash shell的概念,如联机帮助页的“ 调用”部分所述。(这与James Youngman回答中关于用作文件中“外壳”(或用户命令解释器)的任意命令的解释passwd(5)以及该程序是否接受用户输入的解释不同;有些/usr/sbin/nologin显然不接受。 )
您是正确的,/bin/bash --login some-script.sh它将产生非交互式登录Bash调用,这也许是一个病理示例。还有一种情况,也许罕见的,但不是真正的怪异,产生一个非交互式登录shell: ssh somehost < some-file。这里sshd将以argv[0]设置为Bash开头,-bash因为没有给它运行命令,从而使Bash认为自己是登录shell,但是由于stdin没有连接到终端,Bash不会将自己设置为交互模式($-将不包含i) 。
(从个人角度来看,这种情况似乎比相反的情况要合理得多,ssh somehost somecommand尽管与上述情况相反,该情况也不算是“登录外壳” somehost)。
最近,我做了我很早以前应该做的事情,并汇总了Bash模式的表以及运行了哪些init文件。如果您发现它令人困惑,至少也要相信我。这使我迷惑了它们的最初目标与.bashrc执行时间的规则有关。
按新安装的系统上的数量计,大多数登录外壳是非交互式的,实际上是:
$ awk -F: '{print $7}' < /etc/passwd | sort | uniq -c
5 /bin/bash
23 /bin/false
1 /bin/sh
1 /bin/sync
17 /usr/sbin/nologin
显然/bin/bash,/bin/sh它们是传统的外壳,它们是交互式的。但是该列表中的所有其他项目都是非交互的。如果您正在阅读列表,但不知道其中一个是做什么的,则可以查找其手册页(例如man nologin或man sync)。
该命令的实际作用
查看Man Captain的发布历史,我发现他们对Unix缺乏经验。因此,也许注释中有关不遵循的问题与答案顶部的命令行有关,而不仅仅是输出。因此,即使这个问题确实不在主题之列,我也将对其进行解释。
该命令是Unix管道。管道是一连串的命令-从左到右阅读-在其中,第一个命令的输出成为第二个命令的输入,第二个命令的输出成为第三个命令的输入,依此类推,直到管道末端。最后一个进程的输出显示在终端上(除非已被重定向)。有关更多信息,请参见外壳程序管道上的Wikipedia条目。
如果您不了解管道在做什么,则可以简单地分段运行它以查看发生了什么。您还可以阅读的手册页正在使用(这里的命令awk,sort和uniq)。实际上,您现在应该这样做。我会等。
让我们逐步运行管道的各个阶段(您可以在自己的Unix系统上安全地执行此操作):
~$ awk -F: '{print $7}' < /etc/passwd | sed -e 's/^/ /'
/bin/bash
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/sync
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/usr/sbin/nologin
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
/usr/sbin/nologin
[ ... and so on, I've left the rest out ... ]
上面的输出只是/etc/passwd文件中第七个字段的内容。那就是(纯文本文件)数据库,它告诉系统每个人的登录外壳是什么。如果您想了解更多信息/etc/passwd,请阅读它(它是世界可读的),并查看它的手册页(man 5 passwd)。
因此,在这里阅读整个列表,您可以了解流行项目是什么,但这并不是回答此问题的好格式,因为问题实际上是关于非交互shell的普遍程度。让我们算一下。最简单的方法是首先对项目进行排序:
~$ awk -F: '{print $7}' < /etc/passwd | sort
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/bash
/bin/false
/bin/false
/bin/false
/bin/false
/bin/false
[ ... and so on, I've left the rest out ... ]
我们可以使用该程序uniq向我们显示唯一的项目:
〜$ awk -F:'{print $ 7}'</ etc / passwd | 排序 uniq | sed -e's / ^ / /'/ bin / bash / bin / false / bin / sh / bin / sync / usr / sbin / nologin
但是等等,那没用,那里有多少个?让我们问uniq(阅读手册页!):
~$ awk -F: '{print $7}' < /etc/passwd | sort | uniq -c
5 /bin/bash
23 /bin/false
1 /bin/sh
1 /bin/sync
17 /usr/sbin/nologin
当然,这就是我们在答案顶部看到的输出。让我们再次对其进行排序以按顺序查看条目:
~$ awk -F: '{print $7}' < /etc/passwd | sort | uniq -c | sort
17 /usr/sbin/nologin
1 /bin/sh
1 /bin/sync
23 /bin/false
5 /bin/bash
等等,这可能不对,17在1之前出现,5在23之后出现。问题是项目按字典顺序排序。让我们要求sort对它们进行数字排序,并以相反的顺序进行:
~$ awk -F: '{print $7}' < /etc/passwd | sort | uniq -c | sort -n -r
23 /bin/false
17 /usr/sbin/nologin
5 /bin/bash
1 /bin/sync
1 /bin/sh
我认为这可以解释原始答案中的所有内容。如果您仍不清楚这些命令的详细信息,可以阅读手册页。如果您仍然不清楚所发生的事情的原理,那么最好先阅读一本(在线或纸上)解释Unix和Linux的书。
/bin/sync贝壳?那么任何实用程序都是外壳程序吗?
bash --login在问题中写了,他正在特别地询问bash没有i设置选项的过程。(这些来自诸如ssh somehost < script.sh;之类的命令,按照Bash手册页的INVOCATION部分中指定的方式,是“登录,非交互式” shell 。)
telnet towel.blinkenlights.nl对于非交互式登录外壳;-)