[分享]终极Shell——Zsh

仅仅用于软件推荐,不适合发求软件或软件使用问题方面的贴子
回复

心动VS行动?

行动
87
44%
心动
21
11%
以静制动
91
46%
 
总计票数: 199
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#106

帖子 kardinal » 2009-02-28 10:39

BT 玩法…… 反复执行以下命令 :em09

代码: 全选

cd .zsh_history$HOME
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#107

帖子 kardinal » 2009-02-28 11:28

还有点小问题

当前目录为 1/ , 切换到 2/
在 1/ 中

代码: 全选

cd 2/
"cd 2" 应该被保存为 1/ 的纪录,但实际上 1/ 和 2/ 中都有 "cd 2" 这个命令
头像
interskh
帖子: 203
注册时间: 2005-11-16 10:42
联系:

Re: [分享]终极Shell——Zsh

#108

帖子 interskh » 2009-03-01 3:47

用上了 ~~~ 很好用哈
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#109

帖子 kardinal » 2009-03-01 19:10

每个目录使用一个历史纪录文件,想要查看全部纪录就比较麻烦一点,如下:

代码: 全选

#使用 histall 命令查看全部历史纪录
function allhistory { cat $(find $HOME/.zsh_history -name zhistory) | sort }
function convhistory {
                awk -F"[:;]" '{ 
            print  "[" strftime("%Y-%m-%d %T",$2) "]" , $4 
                }'  $1
}

function histall { convhistory =(allhistory) }

#全部历史纪录 top15
function top15 { cat =(allhistory) | awk -F':[ 0-9]*:[0-9]*;' '{ print $1 , $2 }' | sort | uniq -c | sort -nr | head -n 15 }
配置文件已更新,在二 :em41

PS: 使用 convhistory 可以将历史纪录中的 Unix 时间格式转换为人类能够看懂的格式,例如:
convhistory $HISTFILE

PS2: top10 和 top15 统计的方法似乎是不一样的, top10 似乎同命令不同参数也算一个命令, top15 命令必须完全相同
似乎 top10 的方式更好……哪天无聊了再折腾吧
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#110

帖子 kardinal » 2009-03-02 10:00

改了一下这个:

代码: 全选

function convhistory {
                awk -F"[:;]" '{
                $1=""; $3="";
                $2=strftime("%Y-%m-%d %T",$2) "|";
                print  }'  $1
}
原来的版本,如果命令中出现多个分隔符 ":" 或 ";"
分隔符后面的部分不能显示。
现在能显示除了分隔符的全部内容,比如说:

代码: 全选

a  ; b ; c 
使用 hist 查看纪录时显示的是

代码: 全选

 2009-03-02 07:49:59|  a   b   c
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#111

帖子 kardinal » 2009-03-02 11:12

kardinal 写了:还有点小问题

当前目录为 1/ , 切换到 2/
在 1/ 中

代码: 全选

cd 2/
"cd 2" 应该被保存为 1/ 的纪录,但实际上 1/ 和 2/ 中都有 "cd 2" 这个命令
似乎可以这样解决:

代码: 全选

export HISTCONTROL=ignoredups
但是这个变量对 ZSH 好像没用 :em06
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#112

帖子 kardinal » 2009-03-02 13:53

kardinal 写了: 原来的版本,如果命令中出现多个分隔符 ":" 或 ";"
分隔符后面的部分不能显示。

代码: 全选

function allhistory { cat $(find $HOME/.zsh_history -name zhistory) }
function convhistory {
            sort $1 | uniq |
            sed 's/^:\([ 0-9]*\):[0-9]*;\(.*\)/\1::::::\2/' |
            awk -F"::::::" '{ $1=strftime("%Y-%m-%d %T",$1) "|"; print }'  
}
#使用 histall 命令查看全部历史纪录
function histall { convhistory =(allhistory) |
            sed '/^.\{20\} *cd/i\\' }
#使用 hist 查看当前目录历史纪录
function hist { convhistory $HISTFILE }
正常了……

代码: 全选

2009-03-02 11:32:31| ls ; ls ;ls
2009-03-02 11:33:12| ls ; du
2009-03-02 11:33:16| du ; ls
2009-03-02 11:33:22| ls ;ls ;du ;du
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#113

帖子 kardinal » 2009-03-02 22:05

代码: 全选

#全部历史纪录关键字 top44 
function top44 { allhistory | awk -F':[ 0-9]*:[0-9]*;' '{ $1="" ; print }' | sed 's/ /\n/g' | sed '/^$/d' | sort | uniq -c | sort -nr | head -n 44 }
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#114

帖子 kardinal » 2009-03-03 22:24

这个改了一下
空行按[tab] 出 “cd [tab]”
这时按[tab] 开始遍历菜单
-[tab] 出 directory stack
--[tab] 变为 +[tab] (负负得正哈)逆序 directory stack

代码: 全选

user-complete(){
    case $BUFFER in
        "cd --" )                  # "cd --" 替换为 "cd +"
        BUFFER="cd +"
        zle end-of-line
        zle expand-or-complete
        ;;
        "cd +-" )                  # "cd +-" 替换为 "cd -"
        BUFFER="cd -"
        zle end-of-line
        zle expand-or-complete
        ;;
        "" )                       # 空行填入 "cd "
        BUFFER="cd "
        zle end-of-line
        zle expand-or-complete
        ;;
        * )
        zle expand-or-complete
        ;;
    esac
}
dushiguaixia
帖子: 20
注册时间: 2008-06-10 18:15

Re: [分享]终极Shell——Zsh

#115

帖子 dushiguaixia » 2009-03-06 9:49

支持LZ的勇于探索的精神,我们国家,尤其是国有企业更需要这种精神。不管你是否接受,至少给我们开了眼界,多了一种选择。不过,是否适合你,只有你自己知道。等到某一天bash满足不了我的需求,我会考虑Zsh的。 :em11
头像
xxzc
帖子: 151
注册时间: 2009-01-26 17:45
联系:

Re: [分享]终极Shell——Zsh

#116

帖子 xxzc » 2009-03-06 23:04

很像图形界面 :em01
还是舍不了bash
头像
wen1987
帖子: 88
注册时间: 2007-07-04 21:54

Re: [分享]终极Shell——Zsh

#117

帖子 wen1987 » 2009-03-14 16:46

只能说你没研究过 bash。

多重定向功能一点也不难,比如
echo abc | tee file1 file2 > file3
或者
echo abc | tee > >(foo1) > >(foo2) | foo3

zsh 的 $() 与 bash 的 $() 有什么区别?我懒得查文档了。

比较文件夹
diff <(ls a/) <(ls b/)
kardinal 写了:
eexpress 写了:shell熟悉了都好用啊。
这个俺不能认同。举几个例子
ls > a > b > c > d > e
这样的多重重定向,整个 bash 版的瞅瞅
当然,这种用法不实用,但是 zsh 里面管道重定向之类的组合很 BT

$() 这个也比 bash 里的 `` 好用多了
上面的返回内容, =() 返回文件名
比如
diff =(ls a/) =(ls b/) 比较 a b 两个文件夹的文件列表
用 bash 可以么?这些可都是不用任何设置就有的功能哦 :em09
Study or die.
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#118

帖子 kardinal » 2009-03-15 13:39

wen1987 写了:多重定向功能一点也不难,比如
echo abc | tee file1 file2 > file3
或者
echo abc | tee > >(foo1) > >(foo2) | foo3
感觉这个还是比较难的,起码不直观......
而且还要用到 tee
在需要多重定向的时候,大多数人第一反应就是
echo abc > 1 >2 >3
而不是
echo abc | tee 1 2 >3
事实上,如果没有指点,多数人很难自己领悟这种方式.所以说,这个还真是比较难的 :em06

可能我穿凿附会的比较多......其实这些功能并不常用,各种shell 之间的差别也不会很悬殊
SHELL 交互模式中真正有用的是自动补全功能,而且使用率极高.在这一方面,zsh...很暴力...
头像
wen1987
帖子: 88
注册时间: 2007-07-04 21:54

Re: [分享]终极Shell——Zsh

#119

帖子 wen1987 » 2009-03-31 23:37

在 /bin 中建议个新文件在 zsh 中不会补全,要重启 zsh 才行,bash 和 fish 中都可以的,郁闷。

还有 apt-get 的不全速度太囧了,有办法改进吗?
Study or die.
kardinal
帖子: 750
注册时间: 2006-03-19 11:39

Re: [分享]终极Shell——Zsh

#120

帖子 kardinal » 2009-04-03 9:07

工作原理不一样吧,ZSH似乎是先生成哈希表,这样查找快
rehash 试试看(我琢磨着重启ZSH的时候应该包括这一步)

apt-get 我很长时间没用过了 :em06 不过用 pacman 的速度和 apt-get 应该差不多
我这里用 pacman 补全的速度还是可以的
这里面的原因也比较复杂,比如说文件系统的原因:
1 我在 ext4 文件系统下补全 pacman 就很流畅
2 在 jfs 下补全偶尔有点卡
还有可能和操作有关:
1 pacman -R xxx 删除软件,补全很快
2 pacman -S xxx 安装软件,补全就要稍慢。因为可以安装的(未安装)软件要远远多于可以删除的(已安装)软件
如果速度实在太慢,也有可能是你进行的操作需要通过网络进行……那样就没谱了 :em06
回复