你能在这个 bash 代码中为我解释这三件事吗?

som*_*ing 10 shell sed cd-command function variable

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
}
Run Code Online (Sandbox Code Playgroud)

但是你能帮我解释一下这三件事吗?

  1. d=$d/..
  2. sed 's/^\///'
  3. d=..

为什么不这样做:

up()
{
    limit=$1

    for ((i=1 ; i <= limit ; i++))
    do
        cd ..
    done
}
Run Code Online (Sandbox Code Playgroud)

用法:

<<<>>>~$ up 3
<<<>>>/$
Run Code Online (Sandbox Code Playgroud)

Ste*_*itt 24

  1. d=$d/..添加/..d变量的当前内容。d开始是空的,然后第一次迭代使它成为/..,第二次/../..等等。

  2. sed 's/^\///'删除第一个/,因此/../..变为 ../..(这可以使用参数扩展来完成,d=${d#/})。

  3. d=.. 仅在其条件的上下文中才有意义:

    if [ -z "$d" ]; then
      d=..
    fi
    
    Run Code Online (Sandbox Code Playgroud)

    这确保,如果此时d为空,您将转到父目录。(up没有参数相当于cd ..。)

这种方法比迭代更好,cd ..因为它保留了cd -- 一步返回上一个目录的能力(从用户的角度来看)。

函数可以简化为:

up() {
  local d=..
  for ((i = 1; i < ${1:-1}; i++)); do d=$d/..; done
  cd $d
}
Run Code Online (Sandbox Code Playgroud)

这假设我们要向上移动至少一个级别,并添加n - 1 个级别,因此我们不需要删除前导/或检查空的$d.

使用 Athena jotathena-jotDebian 中的软件包):

up() { cd $(jot -b .. -s / "${1:-1}"); }
Run Code Online (Sandbox Code Playgroud)

(基于glenn jackman建议的变体)。