man bash
说,
A login shell is one whose first character of argument zero is a -, or
one started with the --login option.
当我们调用 Cygwin 上的终端时mintty -
,我们可以看到 $0 开始有一个连字符 ( -
)。
$ echo $0
-bash
但是如果我们使用--login
选项调用登录 shell,我们就看不到-
.
$bash --login
$echo $0
bash
我的问题是:
的作用是什么
-
?虽然我们在登录 shell invoked 上看不到它--login
,但我们可以通过查询相关的 shell 选项(例如shopt -q login_shell
.它是做什么用的?如果有重要作用
-
,为什么我们在登录shell调用时看不到它呢--login
?我们如何手动调用零参数以 开头的登录 shell
-
?其他 shell 例如 zsh、csh 也是这种情况吗?
答案1
进程名称中的前导破折号(argv[0]
准确地说,是在 中)由调用 shell 的进程(login
或其他类似的进程)放置在那里。它告诉 shell 程序它应该充当登录 shell(read.profile
等)。 shell程序可以选择在其他情况下充当登录shell(例如,如果传递了-l
命令行选项,bash和zsh将充当登录shell)。
回答您的问题:
- 的作用
-
是告诉 shell 充当登录 shell。对于 bash,传递--login
命令行是等效的。 - 您可以看到的角色
-
在 bash 上用--login
选项调用 — 它读取~/.profile
等等。您无法看到-bash
bash 是否被调用为bash --login
而不是-bash
因为 bash 没有被调用为-bash
。 - 典型的 shell 不允许您选择第 0 个参数,它必须是命令名称。使用 zsh,您可以执行
ARGV0=-bash bash
以下操作,使用ksh93
,bash
或者zsh
,您可以执行(exec -a -bash bash)
。在mksh
or中zsh
,你可以这样做hash -- -bash=/bin/bash; -bash
。你不能做类似的事情,因为它是必须从 开始的ln -s /bin/bash ./-bash; ./-bash
整体。你可以这样做,但是它会产生在前面添加的令人讨厌的副作用。argv[0]
-
PATH=:$PATH; -bash
""
$PATH
- 是的。
答案2
问题1和2
man bash
作为您提出问题的一部分,手册页说或者。所以你有两种方式启动登录shell:
- 参数零的第一个字符是 a
-
。 - 从 --login 选项开始。
并且两种方式是相互独立的。参数零的第一个字符是 a 的 shell-
必须是一个登录 shell。但是参数零的第一个字符不是静止的 shell-
可以是登录 shell,也可以不是。当使用 调用时,它是一个登录 shell --login
。
检查登录 shell 的另一种方法:
$ cuonglm at ~
$ bash --login
$ cuonglm at ~
$ grep -- -l /proc/$$/cmdline
Binary file /proc/7620/cmdline matches
问题3
一个简单的方法:
$ cuonglm at ~
$ sudo su -
% root at ~
% shopt -q login_shell && echo "Login shell" || echo "Not login shell"
Login shell
问题4
AFAIK,zsh
与本例csh
相同。bash