Bash

是否有可能有一個非互動式的登錄 shell?

  • January 14, 2017

在解釋此流程圖時

在此處輸入圖像描述

我在 man bash 中發現:

當 bash 作為互動式登錄 shell 或作為帶有 –login 選項的非互動式 shell 呼叫時,它首先從文件 /etc/profile 中讀取並執行命令(如果該文件存在)。

這表明互動式登錄shell 讀取/etc/profile(沒有 –noprofile)

此外,帶有read選項的非互動式shell--login``/etc/profile

這似乎留下了一些可能的登錄shell(其中$0以 a 開頭-是非互動式的(執行腳本,可能像 一樣簡單date)可能無法讀取(source)/etc/profile

確認或否認這個想法:

首先,我嘗試使用su -l -,它以 a-作為第一個字元啟動登錄 shell,但我未能使其成為非互動式的(並且能夠提供測試來探測它)。

呼叫類似的東西

$ bash -c 'date' -bash

不報告為登錄 shell(即使第一個字元是 a -)。

試試這個來揭示細節:

   $ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash
      -bash hBc ||shopt -u login_shell||
      Fri Aug 19 06:32:31 EDT 2016

the$0以 a-作為第一個字元,在 value 中沒有i(interactive)$-但不報告為 a login_shell(-u)。在這種情況下,/etc/profile 沒有被讀取,但我不確定這是正確的測試。


在這個答案中還提到了“罕見的非互動式登錄 shell” ,但對這個問題沒有足夠的針對性。


這傢伙的結論/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


簡而言之:

是否可以使用非互動式登錄shell(不使用 –login 或 -l 呼叫)?

如果是真的,它是在讀取/etc/profile文件嗎?

如果上述情況屬實,我們必須得出結論,所有登錄 shell

$$ interactive (or not) $$閱讀 /etc/profile (沒有--noprofile選項)。 注意:要檢測 /etc/profile 正在被讀取,只需在文件的最開頭添加以下命令:

echo "'/etc/profile' is being read"

我已經看到了圖形登錄環境:

exec "$SHELL" -l -c 'exec start-window-or-session-manager'

或相當於:

exec -a "-$SHELL" "$SHELL" <<EOF
exec start-window-or-session-manager
EOF

以便讀取和應用會話初始化文件(例如類似~/.profileBourne 的外殼(以及某些外殼中的相應外殼))。/etc

第一個不適用於所有外殼。-l由大量 shell 支持,但不是全部,並且在某些 shell 上,例如csh/ tcsh,不能與-c. argv[0]但是,所有 shell都-可以理解存在的第一個字元,因為這就是login告訴 shell 它們是登錄 shell 的原因。

在第二種情況下,該外殼的標準輸入不是tty設備(<<由臨時正常文件或取決於外殼的管道實現),因此外殼不是互動式的(互動的定義是人類互動時用它)。

是的,非互動式登錄 shell 是可能的

$ head -1 /etc/profile
echo PROFILE BEING READ

$ echo echo hello | su -
PROFILE BEING READ
stdin: is not a tty
hello

$

引用自:https://unix.stackexchange.com/questions/304447