linux目录跳转利器z脚本阅读理解

前言: z 脚本介绍
z 脚本是linux 下目录跳转的利器.
它的工作原理是:
    a. 它维护有一个目录表,包含目录名称,权值和时间
    b. 在每一个目录下执行操作,都会改变这个目录的权值和时间,这是靠$PROMPT_COMMAND 实现的
    c. 当你要跳转到期望的目录时,你只有敲入简单的几个字符,z 会扩展为正则表达式,从目录表中查到最佳的匹配目录,完成跳转
    d. 它也有浏览目录功能,帮助你查阅

以前我曾经用目录栈方式完成目录跳转,有了_z函数(z 脚本的核心是_z 函数),就抛弃了目录栈跳转,而使用_z跳转

1: grep "_z --add" <<< "$PROMPT_COMMAND" >/dev/null
三个小于号是什么意思 ?
我们知道一个小于号是重定向输入, 三个小于号是什么意思?

   Here Strings
       A variant of here documents, the format is:

              <<<word

       The word undergoes brace expansion, tilde expansion, parameter and variable expansion, command substitution, arithmetic  expan‐
       sion,  and  quote removal.  Pathname expansion and word splitting are not performed.  The result is supplied as a single string
       to the command on its standard input.
    这个词经历括号扩展、倾斜扩展、参数和变量展开、命令替换、算术扩展。
    引号删除。不执行路径名扩展和单词分割。结果作为单个字符串提供给命令的标准输入.

    用白话说,就是:
    这个word经过一系列扩展变成了一个字符串,作为这个命令的标准输入.

 这样我们就清楚了 该命令的含义是从'$PROMPT_COMMAND' grep "_z --add", 输出丢弃,执行的结果会影响命令的返回值.

2: $PROMP_COMMAND 内容
hjj@hjj-Inspiron:~$ echo $PROMPT_COMMAND
(_z --add "$(command pwd -P 2>/dev/null)" 2>/dev/null &);
对照脚本可以理解它的来历,在加载z.sh 的时候被赋值
当你在某个目录下操作命令时,都会先执行_z --add <当前目录> 函数,使得当前目录的权值提升,时间更新!


3:  2>/dev/null >| "$tempfile
     2>/dev/null 我们常见, >| 这个符号是何意义?
     >| 跟> 符号类似,也是重定向含义,细微的区别区别是:
    >| 总是重定向,包括覆盖已经存在的文件
    >  总是重定向,包括覆盖已经存在的文件,但当shell 设置了 -C 选项时,不覆盖已经存在的文件,
    就是说 >| 更坚决,无论如何都要生成新文件


4: cd="$( < <( _z_dirs ) awk -v t="$(date +%s)" -v list="$list" -v typ="$typ" -v q="$fnd" -F"|" '......')
    $() 是执行小括号内的命令,将里面的东西作为命令来执行,将结果付给变量cd.
    例如: str=$(ls); echo $str; 这样也就理解了$() 的意义
    < 是重定向
    <(_z_dirs) 是从进程输出读取
    < <(_z_dirs) 是重定向到_z_dirs 进程的输出.
    例如:
    ls 是列目录命令 cat < <(ls) 也是列目录命令,你知道后面参数的意义了吗?
    cat 本来输入是stdin, 被重定向到 ls 的输出, 其结果等价于ls 命令

    awk 是执行awk 命令,经进程输出作为awk 的 stdin 输入?
    值得注意的是,在awk过滤处理的输出中,例如list=1时,大部分被重定向给stderr, 没有付给cd变量,
    list=""时,只有最佳目录才付给了cd变量, 哈哈,技巧就这么多了!


    这个awk 语句颇耐人寻味,容日后分析!
    bash 的调试可以打开-x 选项, awk的调试主要是用print 打印变量输出了.

5: ${fnd:+ } 含义
    $fnd 为空或不存在不操作,非空用空格代替之意
   故:fnd="$fnd${fnd:+ }$1
    其意是$fnd加上一个空格再加上$1赋值给$fnd
============================================================
问题与解答:
1. 数据库文件,有选择的输出文件行。_z_dirs(),
   这个选择条件就是去除权值及时间后,该行变量是一个存在的目录项.
2. 如何获取目录,权值和时间并且改变权值和时间
    这是用awk处理的,以"|"为分割符,$1为path,$2为rank,$3为time
    处理文件,将rank 存放于rank[path],将time存放于time[path],
    若path与传参path相同,rank[path]要加1,time[path]要为now.
    最后用hash数组重写datafile.
    代码实现参考_z --add 部分
3. 如何查找最佳的匹配
    这也是通过awk 来查找的. 通过暴力搜索(对awk来说很自然)找到最高rank及对应最佳目录,然后输出送给cd变量,参考cd 赋值语句.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值