我在 Google 計算引擎上安裝的 ubuntu 有幾個啟動檔。
是否有任何命令可以告訴我目前正在使用的 shell 正在使用哪個啟動檔案?
答案1
shell 通常在啟動時讀取的檔案清單僅限於少數幾個。但那些反過來可能來源其他的,最終可能會成為一個很大的數字,就像加載複雜的完成系統一樣。
一種方法是使用以下命令運行 shell:
strace -e open your-shell
(或系統上的等效指令,例如truss
// tusc
... dtruss
)
這將列出 shell 開啟的所有檔案。它還會列出它打開的文件和非啟動文件,以及它嘗試但無法打開的文件。
另一種方法可能是使用xtrace
某些 shell 的模式,其中 shell 在 stderr 上輸出它將對每個命令執行的操作。為此,您只需使用該-x
選項呼叫 shell 即可。
預設情況下,某些 shellzsh
會列印正在執行的程式碼來自的檔案的路徑(儘管您可能想要設定PS4
為+%x>
,例如也為在函數中執行的程式碼列印檔案名稱)。對於其他一些像bash
或ksh93
,您可以透過修改變數使其列印它$PS4
。
PS4='+$BASH_SOURCE> ' bash -x
PS4='+${sh.file}> ' ksh93 -x
PS4='+%x> ' zsh -x
使用bash
,您可以對輸出進行後處理,以便僅保留檔案的唯一路徑,例如:
PS4=' <:>$BASH_SOURCE<:>' BASH_XTRACEFD=3 3> >(
awk -F'<:>' 'NF>2 && !seen[$2]++ {print $2}') bash -x
(假設啟動檔案的路徑不包含換行符,或<:>
且在包含的啟動檔案中沒有執行多行命令<:>
)
這些xtrace
基於 - 的方法不會列出空的或僅包含註解或函數定義的啟動檔案(除非這些函數稍後運行),也不會列出 shell 將處理的啟動檔案(如果存在)。
但是,您可以檢索已定義函數的文件
eval "(shopt -s extdebug; declare() { typeset -F \"\$2\"; }
$(typeset -F))" | cut -d ' ' -f 3- | sort -u
與bash
或
type ${(k)functions} | sed -n 's/.*is a shell function from //p' | sort -u
和zsh
。