bashrc 是用什麼語言寫的
通過向 .bashrc 文件添加一個函式,我遇到了一種很酷的方法來提升超過 1 個目錄級別。
只需打開 .bashrc 文件並插入函式即可完成:
#user defined functions function cd_up() { cd $(printf "%0.s../" $(seq 1 $1 )); } alias 'cd..'='cd_up'
我想了解如何閱讀它。
它是用什麼語言寫的?
的內容
.bashrc
由 Bash 本身執行,就像它執行腳本一樣,或者實際上是互動式 shell 的任何內容。它是 POSIX shell 語言的一種變體,具有許多擴展(有些是從其他 shell 借來的,主要是 Ksh,有些是由 Bash 自己創建的)。在這裡,
function cd_up() { ... ; }
定義了一個函式。標準形式是 justcd_up() { ... ; }
,沒有function
關鍵字。這$(...)
是一個命令替換,它在內部執行命令,並將其輸出作為命令行參數。這
printf "%0.s../"
是這裡的訣竅。printf
接受一個格式字元串,類似於 C 函式printf()
,以及一些使用該格式字元串列印的參數。重要的是,它還會根據需要多次重複格式字元串以使用所有參數(C 函式不會也不能這樣做)。說明符%0.s
告訴將參數列印為寬度為零的字元串,因此實際上不會列印參數。但是常量部分
../
為每個參數列印一次,這意味著printf "%0.s../" a b
將列印兩次,等等。$(seq 1 $1)
是另一個命令替換,並且由於seq
列印數字列表,它用於提供所需數量的參數printf
。$1
是目前函式的第一個參數cd_up
。因此,例如
cd_up 2
,將首先執行seq 1 2
,列印1 2
. 這作為參數傳遞給printf
,因此您可以得到printf "%0.s../" 1 2
哪個 prints../../
。這被傳遞給cd
並cd ../../
執行,在目錄樹中上升兩個級別。使用
set -x
,您可以看到 shell 實際執行的命令。Bash 甚至用符號表示嵌套級別+
:/tmp/foo$ set -x /tmp/foo$ cd_up 2 + cd_up 2 +++ seq 1 2 ++ printf %0.s../ 1 2 + cd ../../ /$
請注意,輸出是什麼並不重要
seq
,只是其中有正確數量的單詞。由於沒有引用命令替換,因此輸出會經過分詞,這意味著它在空格上被拆分為多個參數。printf "%0.s../" "$(seq 1 $1)"
總是在格式字元串之後只傳遞一個參數。(請參閱連結頁面上的範例。)編寫類似函式的另一種方法是使用簡單的循環。幾乎在 POSIX sh 中(
local
不是 POSIX):cd_up() { local i=$1 while [ "$i" -gt 0 ]; do cd .. i=$((i - 1)) done }
或在 Bash/Zsh 中,使用算術 for 循環:
cd_up() { local i for (( i=$1; i > 0; i-- )); do cd .. done }
雖然版本
printf
更好,因為它只執行cd
一次,所以cd -
返回到原始目錄,而不是中間目錄。(解決這個問題留作練習。)有關 shell 語言的資源,請參見例如