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)
但是你能帮我解释一下这三件事吗?
d=$d/..sed 's/^\///'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
d=$d/..添加/..到d变量的当前内容。d开始是空的,然后第一次迭代使它成为/..,第二次/../..等等。
sed 's/^\///'删除第一个/,因此/../..变为 ../..(这可以使用参数扩展来完成,d=${d#/})。
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 jot(athena-jotDebian 中的软件包):
up() { cd $(jot -b .. -s / "${1:-1}"); }
Run Code Online (Sandbox Code Playgroud)
(基于glenn jackman建议的变体)。