在解释此流程图时
我发现在男子bash中:
当bash作为交互式登录shell或通过--login选项作为非交互式shell调用时,它首先从文件/ etc / profile中读取并执行命令(如果该文件存在)。
声明交互式登录外壳读取/etc/profile
(不带--noprofile)
另外,非交互式外壳,选项为--login
read/etc/profile
这似乎留下了一些可能的登录外壳程序(其中以$0
开头的-
)可能是非交互的(运行脚本,可能像这样简单date
)可能无法读取(源代码)/etc/profile
。
确认或否认这个想法:
首先,我尝试使用su -l -
,-
以第一个字符开头的登录shell,但是我无法使其变为非交互式(并能够提供测试以测试它)。
叫类似
$ bash -c 'date' -bash
不会报告为登录外壳程序(即使第一个字符是-
)。
尝试一下以揭示细节:
$ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash -bash hBc ||shopt -u login_shell|| Fri Aug 19 06:32:31 EDT 2016
该
$0
有-
作为第一个字符,没有i
在价值(交互)$-
,但它未报即一个login_shell
(在-u)。在这种情况下,/ etc / profile没有被读取,但是我不确定这是正确的测试。
在此答案中还提到了“罕见的非交互式登录外壳” ,但对这个问题不够具体。
阅读摘要表:交互式和非交互式登录shell均已阅读 /etc/profile
Some examples
$ su bob # interactive non-login shell
$ su - bob # interactive login shell
$ exec su - bob # interactive login shell
$ exec su - bob -c 'env' # non-interactive login shell
$ ssh bob@example.com # interactive login shell, `~/.profile`
$ ssh bob@example.com env # non-interactive non-login shell, `~/.bashrc`
已读取exec su - bob -c 'env'
报告的测试/etc/profile
。
简而言之:
是否可以使用非交互式登录外壳程序(未使用--login或-l调用)?
如果为true,是否正在读取/etc/profile
文件?
如果以上都是正确的话,我们必须得出结论:所有登录shell [交互式(或非交互式)]读取/ etc / profile(无--noprofile
选项)。
注意:要检测到正在读取/ etc / profile,只需在文件的开头添加以下命令:
echo "'/etc/profile' is being read"
--login
选项。对于第二个,如果我这样做了exec -a "-bash" "bash" <<<"shopt -p login_shell; echo $0 $-"
(用C qoutes编码),$'/etc/profile read\nshopt -s login_shell\nbash himBH'
那么它是登录名,但它是交互式的。我们需要登录和非交互式。我想念的是什么?