Zsh 的强大特性

重定向功能

示例:

重定向 stdout 和 stderr 到 file command |& >file
同时重定向到多个文件 command >file.1 >file.2

补全类型控制

compctl -g '*.tar.gz *.gz*.tgz' + -g '*(-/)' tar zxvf       

tar zxvf [tab] , 候选菜单中只出现扩展名为 .tar.gz .gz .tgz 的文件。下面代码供参考,extract [tab]解压缩,补全的类型为压缩包,

compctl -g '*.tar.bz2 *.tar.gz *.bz2 *.gz *.jar *.rar *.tar *.tbz2 *.tgz *.zip *.Z' + -g '*(-/)' extract

extract() {
   if [[ -z "$1" ]] ; then
       print -P "usage: \e[1;36mextract\e[1;0m < filename >"
       print -P "       Extract the file specified based on the extension"
   elif [[ -f $1 ]] ; then
       case ${(L)1} in
           *.tar.bz2)  tar -jxvf $1    ;;
           *.tar.gz)   tar -zxvf $1    ;;
           *.bz2)      bunzip2 $1       ;;
           *.gz)       gunzip $1       ;;
           *.jar)      unzip $1       ;;
           *.rar)      unrar x $1       ;;
           *.tar)      tar -xvf $1       ;;
           *.tbz2)     tar -jxvf $1    ;;
           *.tgz)      tar -zxvf $1    ;;
           *.zip)      unzip $1          ;;
           *.Z)        uncompress $1    ;;
           *)          echo "Unable to extract '$1' :: Unknown extension"
       esac
   else
       echo "File ('$1') does not exist!"
   fi
}      

计算器

zsh 可以当作计算器使用

#载入数学函数模块 可以进行一些比较高级的运算
#(也可以将此句写在配置文件中)
$ zmodload zsh/mathfunc   
#$((数学表达式)) 进行运算,使用 echo 显示结果
$ echo $(( sin(1/4.0)**2 + cos(1/4.0)**2 - 1 ))
  -1.1102230246251565e-16
$ echo $(( pi = 4.0 * atan(1.0) ))
  3.1415926535897931
$ echo $(( f = sin(0.3) ))
  0.29552020666133955
$ print $((1e12 * rand48()))
  847909677310.23413
$ print $(( rand48(seed) ))
  0.01043488334700271    

命令替换

# bash 中使用这种形式
$ emacs `find . -name "*.html"`
# zsh 同样支持,并可以使用以下形式    
$ emacs $(ls **/*.html)

# zsh 还可以将命令结果生成临时文件,并返回文件名    
#支持更复杂的输出和过滤。例如,比较 new/old/ 两个文件夹的内容        
$ diff =(ls new/)  =(ls old/)  

#查看生成的临时文件
ls =()