Bash

bashrc 是用什麼語言寫的

  • May 17, 2021

通過向 .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() { ... ; }定義了一個函式。標準形式是 just cd_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 ../../。這被傳遞給cdcd ../../執行,在目錄樹中上升兩個級別。

使用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 語言的資源,請參見例如

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