为什么我们在使用 `--login` 选项调用的登录 shell 上看不到 $0 中的单个连字符?

为什么我们在使用 `--login` 选项调用的登录 shell 上看不到 $0 中的单个连字符?

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

我的问题是:

  1. 的作用是什么-?虽然我们在登录 shell invoked 上看不到它--login,但我们可以通过查询相关的 shell 选项(例如shopt -q login_shell.它是做什么用的?

  2. 如果有重要作用-,为什么我们在登录shell调用时看不到它呢--login

  3. 我们如何手动调用零参数以 开头的登录 shell -

  4. 其他 shell 例如 zsh、csh 也是这种情况吗?

答案1

进程名称中的前导破折号(argv[0]准确地说,是在 中)由调用 shell 的进程(login或其他类似的进程)放置在那里。它告诉 shell 程序它应该充当登录 shell(read.profile等)。 shell程序可以选择在其他情况下充当登录shell(例如,如果传递了-l命令行选项,bash和zsh将充当登录shell)。

回答您的问题:

  1. 的作用-是告诉 shell 充当登录 shell。对于 bash,传递--login命令行是等效的。
  2. 您可以看到的角色-在 bash 上用--login选项调用 — 它读取~/.profile等等。您无法看到-bashbash 是否被调用为bash --login而不是-bash因为 bash 没有被调用为-bash
  3. 典型的 shell 不允许您选择第 0 个参数,它必须是命令名称。使用 zsh,您可以执行ARGV0=-bash bash以下操作,使用ksh93,bash或者zsh,您可以执行(exec -a -bash bash)。在mkshor中zsh,你可以这样做hash -- -bash=/bin/bash; -bash。你不能做类似的事情,因为它是必须从 开始的ln -s /bin/bash ./-bash; ./-bash整体。你可以这样做,但是它会产生在前面添加的令人讨厌的副作用。argv[0]-PATH=:$PATH; -bash""$PATH
  4. 是的。

也可以看看登录 Shell 和非登录 Shell 之间的区别?

答案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

相关内容