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