Shell
你能幫我解釋一下這個 bash 程式碼中的這三件事嗎?
function
我的文件中有一個.bashrc
。我知道它的作用,它增加了 X 多個目錄cd
這裡是:
up() { local d="" limit=$1 for ((i=1 ; i <= limit ; i++)) do d=$d/.. done d=$(echo $d | sed 's/^\///') if [ -z "$d" ]; then d=.. fi cd $d }
但是你能幫我解釋一下這三件事嗎?
d=$d/..
sed 's/^\///'
d=..
為什麼不這樣做:
up() { limit=$1 for ((i=1 ; i <= limit ; i++)) do cd .. done }
用法:
<<<>>>~$ up 3 <<<>>>/$
d=$d/..
添加/..
到d
變數的目前內容。d
開始是空的,然後第一次迭代成功/..
,第二次/../..
等等。sed 's/^\///'
刪除第一個/
,因此/../..
變為../..
(這可以使用參數擴展來完成,d=${d#/}
)。d=..
僅在其條件的上下文中才有意義:if [ -z "$d" ]; then d=.. fi
這樣可以確保,如果
d
此時為空,則轉到父目錄。(up
沒有參數等同於cd ..
。)這種方法比迭代更好,
cd ..
因為它保留cd -
了一步返回上一個目錄的能力(從使用者的角度來看)。函式可以簡化:
up() { local d=.. for ((i = 1; i < ${1:-1}; i++)); do d=$d/..; done cd $d }
這假設我們至少要向上移動一級,並添加n - 1級,因此我們不需要刪除前導
/
或檢查空的$d
.使用 Athena
jot
(athena-jot
Debian 中的軟體包):up() { cd $(jot -b .. -s / "${1:-1}"); }
(基於glenn jackman建議的變體)。