我的 shell 正在使用哪個啟動檔案?

我的 shell 正在使用哪個啟動檔案?

我在 Google 計算引擎上安裝的 ubuntu 有幾個啟動檔。

是否有任何命令可以告訴我目前正在使用的 shell 正在使用哪個啟動檔案?

答案1

shell 通常在啟動時讀取的檔案清單僅限於少數幾個。但那些反過來可能來源其他的,最終可能會成為一個很大的數字,就像加載複雜的完成系統一樣。

一種方法是使用以下命令運行 shell:

strace -e open your-shell

(或系統上的等效指令,例如truss// tusc... dtruss

這將列出 shell 開啟的所有檔案。它還會列出它打開的文件和非啟動文件,以及它嘗試但無法打開的文件。

另一種方法可能是使用xtrace某些 shell 的模式,其中 shell 在 stderr 上輸出它將對每個命令執行的操作。為此,您只需使用該-x選項呼叫 shell 即可。

預設情況下,某些 shellzsh會列印正在執行的程式碼來自的檔案的路徑(儘管您可能想要設定PS4+%x>,例如也為在函數中執行的程式碼列印檔案名稱)。對於其他一些像bashksh93,您可以透過修改變數使其列印它$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

相關內容