為什麼我們在使用 `--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

相關內容