是否有可能有一個非互動式的登錄 shell?
在解釋此流程圖時
我在 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)$-
但不報告為 alogin_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
以便讀取和應用會話初始化文件(例如類似
~/.profile
Bourne 的外殼(以及某些外殼中的相應外殼))。/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 $