ZSH-LOVERS(1) ZSH-LOVERS(1) (NAME) zsh-lovers - Z shell (SYNOPSIS) . ;-) (OVERVIEW) zsh () . zsh ( procmailex(5)) . . zsh-users zsh-workers . LINKS . : (zsh-lovers(1)) Z shell ! ;) BUGS . (SHELL-SCRIPTING) . . . ZWS Adam Chodorowski (http://www.chodorowski.com/projects/zws): parse_options() { o_port=(-p 9999) o_root=(-r WWW) o_log=(-d ZWS.log) zparseopts -K -- p:=o_port r:=o_root l:=o_log h=o_help if [[ $? != 0 || "$o_help" != "" ]]; then echo Usage: $(basename "$0") "[-p PORT] [-r DIRECTORY]" exit 1 fi port=$o_port[2] root=$o_root[2] log=$o_log[2] if [[ $root[1] != '/' ]]; then root="$PWD/$root"; fi } # now use the function: parse_options $* (EXAMPLES) Aliases Completion Unsorted/Misc examples (Recursive) Globbing - Examples Modifiers usage Redirection-Examples ZMV-Examples Module-Examples. (ALIASES) (Suffix aliases) 4.2.0 zsh . : alias -s tex=vim alias -s html=w3m alias -s org=w3m foobar.tex vim foobar.tex . html w3m . www.zsh.org w3m www.zsh.org . (Global aliases) . : $ alias -g C='| wc -l' $ grep alias ~/.zsh/* C 443 ( ): alias -g ...='../..' alias -g ....='../../..' alias -g .....='../../../..' alias -g CA="2>&1 | cat -A" alias -g C='| wc -l' alias -g D="DISPLAY=:0.0" alias -g DN=/dev/null alias -g ED="export DISPLAY=:0.0" alias -g EG='|& egrep' alias -g EH='|& head' alias -g EL='|& less' alias -g ELS='|& less -S' alias -g ETL='|& tail -20' alias -g ET='|& tail' alias -g F=' | fmt -' alias -g G='| egrep' alias -g H='| head' alias -g HL='|& head -20' alias -g Sk="*~(*.bz2|*.gz|*.tgz|*.zip|*.z)" alias -g LL="2>&1 | less" alias -g L="| less" alias -g LS='| less -S' alias -g MM='| most' alias -g M='| more' alias -g NE="2> /dev/null" alias -g NS='| sort -n' alias -g NUL="> /dev/null 2>&1" alias -g PIPE='|' alias -g R=' > /c/aaa/tee.txt ' alias -g RNS='| sort -nr' alias -g S='| sort' alias -g TL='| tail -20' alias -g T='| tail' alias -g US='| sort -u' alias -g VM=/var/log/messages alias -g X0G='| xargs -0 egrep' alias -g X0='| xargs -0' alias -g XG='| xargs egrep' alias -g X='| xargs' : man 1 zshcompctl zshcompsys zshcompwid. zshcompctl zsh zshcompsys zshcompwid zsh . _apt _dpkg . ( ) (cache) . cache: zstyle ':completion:*' use-cache on zstyle ':completion:*' cache-path ~/.zsh/cache CVS: zstyle ':completion:*:(all-|)files' ignored-patterns '(|*/)CVS' zstyle ':completion:*:cd:*' ignored-patterns '(*/)#CVS' () : zstyle ':completion:*' completer _complete _match _approximate zstyle ':completion:*:match:*' original only zstyle ':completion:*:approximate:*' max-errors 1 numeric _approximate : zstyle -e ':completion:*:approximate:*' \ max-errors 'reply=($((($#PREFIX+$#SUFFIX)/3))numeric)' : zstyle ':completion:*:functions' ignored-patterns '_*' : xdvi() { command xdvi ${*:-*.dvi(om[1])} } : zstyle ':completion:*:*:xdvi:*' menu yes select zstyle ':completion:*:*:xdvi:*' file-sort time (PID) : zstyle ':completion:*:*:kill:*' menu yes select zstyle ':completion:*:kill:*' force-list always ( ln) zstyle ':completion:*' squeeze-slashes true cd (: cd ../): zstyle ':completion:*:cd:*' ignore-parents parent pwd . ~/.zshrc "cd ..../dir" rationalise-dot() { if [[ $LBUFFER = *.. ]]; then LBUFFER+=/.. else LBUFFER+=. fi } zle -N rationalise-dot bindkey . rationalise-dot : (glob Qualifiers) zshexpn(1) . "man 1 zshexpn | less -p" Qualifiers . # ** ** # ( ``-L'' ) $ print -rl -- *(.^e{'grep -q pattern $REPLY'}) # $ : *(.e{'grep -q pattern $REPLY || print -r -- $REPLY'}) # $ echo $[${RANDOM}%1000] # 0-999 $ echo $[${RANDOM}%11+10] # 10-20 $ echo ${(l:3::0:)${RANDOM}} # N ( ) # $ echo "${(j::)${(@Oa)${(s::):-hello}}}" # $ ls -ld *(/om[1]) # $ FILES=( .../files/* ) $ feh $FILES[$RANDOM%$#FILES+1] # $ for file (*(ND-.)) IFS= read -re < $file # $ if [[ $1 == <-> ]] ; then echo numeric else echo non-numeric fi # .c .o . $ print *.c(e_'[[ ! -e $REPLY:r.o ]]'_) # /var/ root $ ls -ld /var/*(^u:root) # $ echo *(f:u+rx:) # $ echo *(f:u+rx,o-x:) # (brace expansion) - $ X=(A B C) $ Y=(+ -) $ print -r -- $^X.$^Y A.+ A.- B.+ B.- C.+ C.- # 'fgractg*.log' # 'ORA-' $ file=(fgractg*.log(Nm0om[1])) $ (($#file)) && grep -l ORA- $file # Zsh $ files=$( find . -name . -o -prune -name 'fgractg*>log' -mtime 0 -print ) > if [ -n "$files" ]; then > IFS=' > ' > set -f > file=$(ls -td $files | head -1) > grep -l ORA- "$file" > fi # $ zsh -c 'sleep 1 & sleep 3 & sleep 2& print -rl -- $jobtexts' # .bak $ rm -i *(.L0) *.bak(.) # $ printf '%s\n' ^?*.* $ printf '%s\n' ^?*.[^.]*(D) $ ls -d -- ^?*.*(D) # $ print -rl file* | comm -2 -3 - <(grep -l string file*)' $ for f (file*(N)) grep -q string $f || print -r $f' # / . $options $builtins # $ echo $options[correct] off $ $options[zle] on # $ print $((${${(z)${(f)"$(dirs -v)"}[-1]}[1]} + 1)) # $ dirs -v | awk '{n=$1}END{print n+1}' # $ ls *~*.*(.) # IP ``ifconfig device'' # ifconfig net-tools ( ) $ print ${${$(LC_ALL=C /sbin/ifconfig eth0)[7]}:gs/addr://} # ifconfig 4.2BSD {Free,Net,Open}BSD $ print ${$(/sbin/ifconfig tun0)[6]} # IP C # /etc/hosts $ for i in {1..254}; do ping -c 1 192.168.13.$i; done $ I=1 $ while ( [[ $I -le 255 ]] ) ; do ping -1 2 150.150.150.$I; let I++; done $ for i in $(sed 's/#.*//' > /etc/hosts | awk '{print $2}') : do : echo "Trying $i ... " : ping -c 1 $i ; : echo '=============================' : done # $ typeset -U m $ m=() $ for md ($module_path) m=($m $md/**/*(*e:'REPLY=${REPLY#$md/}'::r)) $ zmodload -i $m # # . $ i=1; for j in *; do mv $j $i.$j; ((i++)); done $ i=1; for f in *; do mv $f $(echo $i | \ awk '{ printf("%03d", $0)}').$f; ((i++)); done $ integer i=0; for f in *; do mv $f $[i+=1].$f; done # ( ) # . $ $ file **/*(D@) | fgrep broken $ for i in **/*(D@); [[ -f $i || -d $i ]] || echo $i $ echo **/*(@-^./=%p) $ print -l **/*(-@) # `fignore' $ ls **/*~*(${~${(j/|/)fignore}})(.) # $ ls **/*~*(${~${(j/|/)fignore}})(.^*) # ( *setopt extendedglob* # *setopt dotglob*) $ printf '%s\n' ^?*.* # $ print -rl -- *(On) $ print -rl -- *(^on) # ``ps ax | awk '{print $1}''' $ print -l /proc/*/cwd(:h:t:s/self//) # PID ( ``ps'' ``sed'' ``pgrep'' .. # ) $ pid2 () { > local i > for i in /proc/<->/stat > do > [[ "$(< $i)" = *\((${(j:|:)~@})\)* ]] && echo $i:h:t > done > } # X 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' do ... $ for (( i = 36#n; i <= 36#y; i++ )); do > print ${$(([##36]i)):l} > done # ``dc'' $ print {$((##n))..$((##y))}P\ 10P | dc # ``eval'' $ eval print '${$(([##36]'{$((36#n))..$((36#y))}')):l}' # foreach $ for f (*) print -r -- $f # / $ dirs=(**/*(/)) $ cd -- $dest_root $ mkdir -p -- $dirs # zsh $ find . -type d -exec env d="$dest_root" \ sh -c ' exec mkdir -p -- "$d/$1"' '{}' '{}' \; # `foo=23'' '0'. $ foo=23 $ print ${(r:10::0:)foo} # # print -rl $HOME/${(l:20::?:)~:-}* # $ print -r -- ${(qq)m} > $nameoffile # $ eval "m=($(cat -- $nameoffile)" # $ m=("${(@Q)${(z)"$(cat -- $nameoffile)"}}") # # "ls -l" # ( "ls -l" # ) $ ls -tld **/*(m-2) # ( ls -R). # "ls -R" # . $ for d (. ./**/*(/)) { > print -r -- $'\n'${d}: > cd $d && { > l=(*(Nm-2)) > (($#l)) && ls -ltd -- $l > cd ~- > } > } # mtime # : $ for d (. ./**/*(/)) { > print -r -- $'\n'${d}: > cd $d && { > l=(*(N/,m-2)) > (($#l)) && ls -ltd -- $l > cd ~- > } > } # mtime < 2 : $ for d (. ./**/*(N/m-2)) { > print -r -- $'\n'${d}: > cd $d && { > l=(*(Nm-2)) > (($#l)) && ls -ltd -- $l > cd ~- > } > } # ``-'' $ echo ${(l:42::-:)} # ``$COLUMS'' $ echo ${(l:$COLUMNS::-:)} # ( autoload colors ;colors) $ echo "$bg[red]$fg[black]${(l:42::-:)}" # STDERR xless STDOUT. $ foo 2>>(xless) # . : $ { { foo 1>&3 } 2>&1 | xless } 3>&1 # MP3 name with spaces.mp3 Name With Spaces.mp3 $ for i in *.mp3; do > mv $i ${${(C)i}:s/Mp3/mp3/} > done # .xml ( # *setopt kshglob*) $ ls -l [0-9]##.xml $ ls -l <0->.xml # (" txt") $ rm ./^*.txt # $ mv -- *([1,200]) /another/Dir # (foo.gif => foo.png): $ for i in **/*.gif; convert $i $i:r.png # mp3 wave cdr # ( file.wav -> file.mp3) $ for i (./*.mp3){mpg321 --w - $i > ${i:r}.wav} # LaTeX2HTML ( ZSH-Guide): $ for f in https://zsh.sourceforge.io/Guide/zshguide{,{01..08}}.html; do > lynx -source $f >${f:t} > done # dir1 dir2 # "/more10" $ mv dir[12]/**/*.cr(-.e{'((`wc -l < $REPLY` > 10))'}) /more10 # dpkg $ diff <(find / | sort) <(cat /var/lib/dpkg/info/*.list | sort) # (Escape-Sequences) : $ autoload colors ; colors $ print "$bg[cyan]$fg[blue]You are a idiot" >> /dev/pts/3 # ASCII $ char=N ; print $((#char)) # ("Erweiterung") # : (N) nullglob # (glob pattern) . $ for i in *.o(N); do > rm $i > done # FOO foo bar BAR $ for i in *(.); mv $i ${i:l} # `FOO' `foo' $ for i in *(.); mv $i ${i:u} # `bar `BAR' # suid $PATH $ ls -latg ${(s.:.)PATH} | grep '^...s' # ;) $ print -l ${^path}/*(Ns,S) # $ print -l ${^path}/*vim*(*N) # gzip $ gzip ${(ps:\0:)"$(grep -lZ foobar ./*.txt(.))"} # stdin stdout # ( unique # unique ). $ IFS=$'\n\n'; print -rl -- ${(Oau)${(Oa)$(cat file;echo .)[1,-2]}} # PATH $ print -l ${^path}/*(-*N) # .c __ SCCS $ ls **/*.c~(*/)#SCCS/* # `README' $ ls **/*(#ia2)readme # $ if [[ $OSTYPE == (#i)LINUX*(#I) ]]; then > echo "Penguin on board." > else > echo "Not a Linux." > fi (glob Qualifiers) zshexpn(1) . : **/ (*/)#! ! : $ print (*/)#zsh_us.ps zsh-4.2.3/Doc/zsh_us.ps $ print **/zsh_us.ps zsh-4.2.3/Doc/zsh_us.ps # `README' $ ls -l **/README # "index.php" "index.html" # "index.*" $ ls **/*(D/e:'[[ -e $REPLY/index.php && -e $REPLY/index.html ]]':) # $ ls **/*(D/e:'l=($REPLY/index.*(N)); (( $#l >= 2 ))':) # find basename $ print -rl /**/*~^*/path(|/*) # - Zsh $ find / | grep -e /path/ -e '/path$' # C # . $ print -rl -- **/*.c(D.OL[1,10]:h) | sort -u # == 0 $ files=(**/*(ND.L0m+0m-2)) > (( $#files > 0 )) && print -rl -- $files | \ mailx -s "empty files" foo@bar.tdl # chmod $ chmod 700 **/(.) # $ chmod 700 **/(/) # # $ print -rC2 -- ${1:[...]}/*(D:t) # ^- # - - $ list=(${1:[...]}/*(ND:t)) $ (($#list)) && print -rC2 -- ${(V)list} # /home/*/*-mail/ ``chmod -s'' # ( dotfile) setgid/setuid # $ chmod -s /home/*/*-mail(DNs,S) /home/*/*-mail/**/*(DNs,S)) # $ for file (/home/*/*-mail(DNs,S) /home/*/*-mail/**/*(DNs,S)) { > print -r -- $file > chmod -s $file && print -r fixed $file > } # ``zargs'' ( autoload zargs) # arg list too long $ zargs /home/*/*-mail(DNs,S) /home/*/*-mail/**/*(DNs,S)) -- chmod -s # `foo23' (foo23 foo24 foo25 ..) $ ls -l foo<23-> # # $ ls -l 200406{04..10}*(N) # 200406XX ( ``setopt extended_glob'') $ ls -l 200306<4-10>.* # $ for a in ./**/*\ *(Dod); do mv $a ${a:h}/${a:t:gs/ /_}; done # *.c *.h $ ls -l *.(c|h) # *.c `foo.c' $ ls *.c~foo.c # ** $ zsh -ec 'while {} {printf %.8x $n;repeat 8 \ > {read -ku0 a printf \ %.8d $(([##2]#a))};print;((n+=8))}' < binary # (world-readable) $ ls -l *(R) # $ print -l ~/*(ND.^w) # # (//) # /Dir $ rm -f /Dir/**/*(.mh+3) # /Dir $ rm -f /Dir/**/*(@mm+3) # /Dir $ rm -f /Dir/**/*(ms+30^/) # $ rm ./**/*(.Dmh+1,.DL0) # $ rm -f **/*(mh+6) # ( # ) $ rm ./*(Om[1,-11]) : arg list too long rm . : $ zmodload zsh/files ; rm -f **/*(mh+6) zargs : $ autoload zargs ; zargs **/*(mh+6) -- rm -f # Z-Shell / .: # # 50 KB # root . # : $ ls **/(#ia1)name(LK+50mw-1u0) # UID 102 666 $ chown 666 **/*(u102) # $ print -rl -- *(Dmh+10^/) # $ rm ./*filename*(Om[1]) # `ls -l' $ ls -fld *(OL) # $ setopt dotglob ; print directory/**/*(om[1]) # $ ls *(L0f.go-w.) # - - . # () $ print -rl -- **/*(Dom[1,10]) # "ls" ( ``ls -laS | head -n 5''). $ ls -fl *(DOL[1,5]) # . $ print -rl -- /path/to/dir/**/*(D.om[5,10]) # . $ chmod someuser /**/*(D^u:${(j.:u:.)${(f)"$( . $ for f in ***/*(/l2); do foo=($f/*(N)); [[ -z $foo ]] && print $f; done # : Zsh 4.2.1 glob F . # *(F) *(/^F) # . $ ls -ld *(/^F) # . $ rmdir ./**/*(/od) 2> /dev/null # `users' . $ ls -l *(G[users]) (Modifiers) (parameter expansion) (filename expansion) (history expansion) . zshexpn(1) . # : Zsh 4.3.4 ! $ autoload -U age # $ print *(e:age today now:) # $ print *(e-age 17:00 now-) # ... $ print *(e-age yesterday,17:00 now-) # ... $ print *(e-age 2006/12/25 today-) # ... $ print *(e-age 1970/01/01 yesterday-) # $ print *(e:age 2006/10/04 2006/10/09:) # $ print *(e:age 2006/10/04:) # . $ print *(e-age 2006/10/04:10:15 2006/10/04:10:45-) # (head). # `dirname' . $ echo =ls(:h) /bin # (tail). # `basename' . $ echo =ls(:t) ls # ( *.sh) $f:e $f :h --> / (dirname) :t --> / (basename) :r --> ( ) $ for f (*.sh) mv $f $f:r # `.xxx' . $ echo $PWD /usr/src/linux $ echo $PWD:t linux # . $ foo=23.42 $ echo $foo 23.42 $ echo $foo:e 42 # . (history expansion) # . $ echo =ls(:h) /bin $ !echo:p $ echo =ls(:h) # . $ bar="23'42" $ echo $bar 23'42 $ echo $bar:q 23\'42 # . $ bar=FOOBAR $ echo $bar FOOBAR $ echo $bar:l foobar # . $ bar=foobar $ echo $bar foobar $ echo $bar:u FOOBAR # $ foo="one two three four" $ print -r -- "${(C)foo}" One Two Three Four (Redirection-Examples) zshmisc(1) ( less ${^fpath}/zmv(N)) # `exit 1' *.sh $ echo "exit 1" >> *.sh # foobar.tar.gz $ eval set =(gunzip < foobar.tar.gz) ' tar rf $1 additional.txt &&gzip < $1 > foobar.tar.gz' # $ foobar >&1 > file1 > file2 > .. # (pipe) $ zcat foobar.Z >> (gzip -9 > file1.gz) \ >> (bzip2 -9 > file1.bz2) \ >> (acb --best > file1.acb) # /etc/services `foo' `bar' $ cat /etc/services >> foo >> bar # STDERR ( ) $ echo An error >&2 2>&1 | sed -e 's/A/I/' # # $ setopt multios $ process1 > >(process1) > >(process2) # $ setopt multios $ { a=$(command >&1 >& 3 3 > &- 2>&1);} 3>&1 # stderr $ setopt multios ; program 2> file2 > file1 2>&1 # stdout stderr $ exec 3>&1 > logfile 2>&2 2>&1 >&3 3>&- # stderr () stderr : $ command 2>&2 2>stderr # stderr stdout stdout : $ command 2>&1 1>&1 2>stderr 1>stdout # stderr stdout stdout stdout # stderr stderr : $ command 2>&2 1>&1 2>stderr 1>stdout # STDERR ;) $ ./my-script.sh 2> >(grep -v moron >error.log)|process-output >output.log $ echo "Thats STDOUT" >>(sed 's/stdout/another example/' > foobar) : -n ( ). # fat32. : # / : ; * ? " < > | # : ``-Q'' (D) . $ unwanted='[:;*?\"<>|]' $ zmv -Q "(**/)(*$~unwanted*)(D)" '$1${2//$~unwanted/}' # ( "file-hell.name" -> "file-heaven.name") $ zmv '(*)hell(*)' '${1}heaven${2}' # $ zmv '*' '$f:s/hell/heaven/' # # foo-(bar).avi -> foo-bar.avi $ zmv '*' '${f//[()]/}' # (foo.foo > 1.foo, fnord.foo > 2.foo, ..) $ autoload zmv $ ls * 1.c asd.foo bla.foo fnord.foo foo.fnord foo.foo $ c=1 zmv '*.foo' '$((c++)).foo' $ ls * 1.c 1.foo 2.foo 3.foo 4.foo foo.fnord # "file.with.many.dots.txt" ( # !) $ touch {1..20}-file.with.many.dots.txt $ zmv '(*.*)(.*)' '${1//./ }$2' # $ zmv -n '*' '$f[5,-1]' # : "5" ! # # . $ zmv -Qv '(**/)(*)(.D)' '$1${(L)2}' # "1" "2" $ autoload -U zmv $ zmv '(???)1(???[1-4].txt)' '${1}2${2}' # $ touch 111111111111111{a-z} $ autoload zmv $ zmv '*' '$f[16,-1]' # ( ) $ autload zmv $ zmv -n '(**/)(* *)' '$1${2//( #-## #| ##)/-}' # - Bash $ find . -depth -name '* *' -exec bash -c ' > shopt -s extglob > file=$1 > dir=${file%/*} > name=${file##*/} > newname=${name//*([ -]) *([ -])/-} > mv -i -- "$file" "$Dir/$newname"' {} {} \; # $ autoload zmv $ zmv -n '(**/)(*)' '$1${2//[^A-Za-z0-9._]/_}' # *.py python ( # *.py ) $ autoload zmv $ zmv -n '(**/)(con*)(#qe,file $REPLY | grep "python script",)' '$1$2.py' # ( *.JPG) $ autoload zmv $ zmv '(**/)(*).(#i)jpg' '$1$2.jpg' # - Zsh $ find Dir -name '*.[jJ][pP][gG]' -print | while read f > do > case $f in > *.jpg) ; > *) mv "$f" "${f%.*}.jpg" ; > esac > done # $ autoload zmv $ ls filename.001 filename.003 filename.005 filename.007 filename.009 filename.002 filename.004 filename.006 filename.008 filename.010 $ zmv '(filename.)0##(?*)' '$1$2' $ ls filename.1 filename.10 filename.2 filename.3 filename.4 filename.5 .. # . $ autoload zmv $ ls * foo_10.jpg foo_2.jpg foo_3.jpg foo_4.jpg foo_5.jpg foo_6.jpg .. $ zmv -fQ 'foo_(<0->).jpg(.nOn)' 'foo_$(($1 + 1)).jpg' $ ls * foo_10.jpg foo_11.jpg foo_3.jpg foo_4.jpg foo_5.jpg ... # (1.jpg -> 001.jpg, .. $ autoload zmv $ zmv '(<1->).jpg' '${(l:3::0:)1}.jpg' # >= $ autoload zmv $ c=1 zmv "${(l:30-4::?:)}*.foo" '$((c++)).foo' # (underline) $ autoload zmv $ zmv '* *' '$f:gs/ /_' # *.sh *.pl $ autoload zmv $ zmv -W '*.sh' '*.pl' # ".txt" ${HOME} # ``-.'' # ``D'' (dotfiles) ) $ autoload zmv $ zmv -Q '/home/**/*(D-.)' '$f.txt' # : $ zmv -Q '/home/**/^?*.*(D-.)' '$f.txt' # ? [ ] / = + < > ; : " , - * $ autoload zmv $ chars='[][?=+<>;",*-]' $ zmv '(**/)(*)' '$1${2//$~chars/%}' # ( ) $ autoload zmv $ zmv -Q "(**/)(*'*)(D)" "\$1\${2//'/}" # ( file.txt) # file119.txt file120.txt file118.txt # file119.txt file.txt file1.txt $ autoload zmv $ zmv -fQ 'file([0-9]##).txt(On)' 'file$(($1 + 1)).txt' # / / $ autoload zmv $ zmv '(*)' '${(L)1}' # $ zmv '(*)' '${(U)1}' # # *.c C $ autoload zmv $ zmv '(*).c' '$1' # *.mp3 $ autoload zmv $ zmv '([a-z])(*).mp3' '${(C)1}$2.mp3' # `README' `Makefile' $ autoload zmv $ zmv -C '(**/)Makefile' '${1}README' # ( ) $ autoload zmv $ zmv -Q "(**/)(*'*)(D)" "\$1\${2//'/}" # pic1.jpg pic2.jpg .. pic0001.jpg pic0002.jpg .. $ autoload zmv $ zmv 'pic(*).jpg' 'pic${(l:4::0:)1}.jpg' $ zmv '(**/)pic(*).jpg' '$1/pic${(l:4::0:)2}.jpg' # zshmodules(1) ! zsh/pcre ( zmodload zsh/pcre) # ( ) $ zmodload zsh/pcre $ ls -d -- *(e:'[[ $REPLY -pcre-match pcre-regexp ]]':) # $ m() { [[ $1 -pcre-match pcre-regexp ]] } $ ls -d -- *(+m) zsh/clone ( zmodload zsh/clone) # (forked) ($! ) # ``command'' /dev/tty8 ( ) . $ zmodload zsh/clone $ clone /dev/tty8 && (($! == 0)) && exec command zsh/datetime ( zmodload zsh/datetime) $ zmodload zsh/datetime $ alias datereplacement='strftime "%Y-%m-%d" $EPOCHSECONDS' $ export DATE=`datereplacement` $ echo $DATE # $ $ zmodload zsh/datetime $ setopt extendedglob $ touch aaa_bbb_20041212_c.dat eee_fff_20051019_g.dat $ strftime -s pattern \ '???_???_<0-%Y%m%d>_?.dat' $((EPOCHSECONDS - 365 * 24 * 60 * 60 / 2)) $ print -rl -- $~pattern aaa_bbb_20041212_c.dat $ print -rl -- $pattern ???_???_<0-20050815>_?.dat # == 0 # << >> (last modified) $ zmodload -i zsh/datetime $ strftime -s file "abc_de_%m%d%Y.dat" $((EPOCHSECONDS - 24 * 60 * 60 )) $ files=(**/$file(N.L0)) $ (( $#files > 0 )) && print -rl -- $files | \ mailx -s "empty files" foo@bar.tdl zsh/stat ( zmodload zsh/stat) # $ zmodload -i zsh/stat $ ! stat -LH s foo.ln || [[ $s[link] != "foo.exe" ]] || ln -sf foo.exe foo.ln # $ zmodload zsh/stat $ file1=foo $ file2=bar $ touch bar & sleep 5 & touch foo $ echo $file1 is $(($(stat +mtime $file2) - \ $(stat +mtime $file1))) seconds older than $file2. bar is 5 seconds older than foo # $ zmodload zsh/stat $ stat -A max +size some-other-file $ print -rl ./**/*(D.L-$max) # $ zmodload zsh/stat $ ls -fld ./**/*(d`stat +device .`OL[1,100]) # ( # ls -l * | awk '{print $3" " $8}') $ zmodload zsh/stat $ for file; do > stat -sA user +uid -- "$file" && > print -r -- "$user" "$file" > done # $ zmodload zsh/stat $ print $(($(stat +block -- file) * 512 - $(stat +size -- file))) # # ``D'' : / (d ) # ``O'' : (o ) # ``L'' : (l ) # ``[1]'': $ zmodload zsh/stat $ stat +size ./*(DOL[1]) # $ zmodload zsh/stat $ stat -L +size ~/.zshrc 4707 # # . $ zmodload zsh/stat zsh/files $ typeset -A f; f=() $ rm -f /path/**/*(.a+10e{'stat -sA u +uidr $REPLY; f[$u]="$f[$u]$REPLY"'}) $ for user (${(k)f}) {print -rn $f[$user]|mailx -s "..." $user} # "ls -l" # $ zmodload zsh/stat $ for d (. ./**/*(N/m-2)) > print -r -- $'\n'$d: && cd $d && { > for f (*(Nm-2om)) > stat -F '%b %d %H:%M' -LsAs -- $f && > print -r -- $s[3] ${(l:4:)s[4]} ${(l:8:)s[5]} \ > ${(l:8:)s[6]} ${(l:8:)s[8]} $s[10] $f ${s[14]:+-> $s[14]} > cd ~- > } # $ zmodload zsh/stat $ stat -F '%d %m %Y' +mtime ~/.zshrc 30 06 2004 $ stat -F '%D' +mtime ~/.zshrc 06/30/04 zsh/files ( zmodload zsh/files) # # . $ zmodload zsh/files $ IFS=$'\0' $ cp $(grep -lZr foobar .) otherdirectory zsh/mapfile ( zmodload zsh/mapfile) # grep $ zmodload zsh/mapfile $ pattern1="foo" $ pattern2="bar foo" $ print -l ./**/*(DN.e{'z=$mapfile[$REPLY] && [[ $z = *$pattern1* && \ $z = *$pattern2* ]]'}) # zsh/pcre $ zmodload -i zsh/mapfile zsh/pcre $ pattern1="foo" $ pattern2="bar foo" $ pcre_compile "(?s)(?=.*?$pattern1).*?$pattern2" $ pcre_study $ print -l ./**/*(DN.e{'pcre_match $mapfile[$REPLY]'}) # ``less /etc/passwd | grep -v root'' $ zmodload zsh/mapfile $ IFS=$'\n\n' $ print -rl -- ${${=mapfile[/etc/passwd]}:#*root*} # - $ setopt extendedglob $ print -rl -- ${${=mapfile[/etc/passwd]}:#*(#i)root*} # XML ``'' ``'' # ( '/>' ) # ``1'' # ``2'' $ zmodload zsh/mapfile $ cnt=0 $ apfile[data.xml.new]=${(S)mapfile[data.xml]//\ > (#im)*<\/TAGA>/$((++cnt))<\/TAGA>} # Maildir/new ``filename="gone.src'' $ zmodload zsh/{files,mapfile} $ rm -f /u1/??/*/Maildir/new/100*(.e{'[[ $mapfile[$REPLY] == \ *filename=\"gone.scr\"* ]]'}) # (Title) postscript grep # $ autoload -U zmv $ zmodload zsh/mapfile $ zmv '(*).ps' '$1-${${${mapfile[$f]##*%%Title: }%% *}//[^a-zA-Z0-9_]/}.ps' zsh/mathfunc ( zmodload zsh/mathfunc) $ zmodload zsh/mathfunc $ 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 zsh/termcap ( zmodload zsh/termcap) $ zmodload -ab zsh/termcap echotc $ GREEN=`echotc AF 2` $ YELLOW=`echotc AF 3` $ RED=`echotc AF 1` $ BRIGHTRED=`echotc md ; echotc AF 1` $ print -l ${GREEN}green ${YELLOW}yellow ${RED}red ${BRIGHTRED}brightred zsh/zpty ( zmodload zsh/zpty) $ zmodload zsh/zpty $ zpty PW passwd $1 $ zpty PW passwd $1 # ``-r'': . # ``z'' : $ zpty -r PW z '*password:' # $ zpty -w PW $2 $ zpty -r PW z '*password:' $ zpty -w PW $2 # -d # . # . # HUP . $ zpty -d PW zsh/net/socket ( zmodload zsh/net/socket) # ``-l'': # ``-d'': # # ``3'' : . ``A User's Guide to the Z-Shell'' # (3.7.2: File descriptors) $ zmodload zsh/net/socket $ zsocket -l -d 3 # ``-a'': $ zsocket -a -d 4 3 $ zsocket -a -d 5 3 # $ echo foobar >&4 $ echo barfoo >&5 $ 4>&- 5>&- 3>& zsh/zftp ( zmodload zsh/zftp) $ autoload -U zfinit $ zfinit $ zfparams www.example.invalid myuserid mypassword $ zfopen $ zfcd tips $ zfls -l zshtips.html $ zfput zshtips.html $ zfls -l zshtips.html # FTP $ autoload -U zfinit ; zfinit $ zftp open host.name.invalid user passwd || exit $ zftp get /remote/file > /local/file; r=$? $ zftp close && exit r # ftp $ autoload -U zfinit ; zfinit $ zftp open host.name.invalid user password $ zftp get $file | bzip2 > ${file}.bz2 $ zftp close # (``get'') $ autoload -U zfinit ; zfinit $ zfanon cr.yp.to $ zfcd daemontools $ for file in `zfls` ; do > zfget $file $ done $ zfclose # $HOME/foobar () # ftp.foobar.invalid/path/to/upload $ autoload -U zfinit ; zfinit $ zfopen ftp.foobar.invalid/path/to/upload $ cd $HOME/foobar $ zfput -r **/*(.mh-2) $ zfclose # ftp $ autoload -U zfinit ; zfinit $ zfopen some-host $ zfcd /some/remote/Dir $ cd /some/local/Dir # list.txt : # zfget ${(f)"$(zftp get /path/to/remote/list.txt)"} $ zfget ${(f)"$(cat list.txt)"} $ zfclose zsh/zselect ( zmodload zsh/zselect) # ,---- | $ sg=$(stty -g) | $ stty -icanon min 0 time 50 | $ read yesno | $ stty "$sg" | $ case "$yesno" in | > yes) command1;; | > *) command2;; | > esac `---- $ zmodload zsh/zselect $ if zselect -t 500 -r 0 && read yesno && [ yes = "$yesno" ]; then > command1 > else > command1 > fi (Navigation options) auto_cd ( ). auto_pushd ( push/pop) pushd_ignore_dups ( ). (Misc) no_hup ( HUP ZSH). print_exit_value ( ) (History options) hist_verify ( ( !ls) ) : setopt SHARE_HISTORY / (Privacy / Security) no_clobber ( set -C > ) (Spelling correction) correct ( ). correct_all ( ) dvorak ( dvorak) / (UNSORTED/MISC) Mailpath: mailpath : mailpath=($HOME/Mail/mbox'?new mail in mbox' $HOME/Mail/tux.u-strasbg'?new mail in tux' $HOME/Mail/lilo'?new mail in lilo' $HOME/Mail/ldap-fr'?new mail in ldap-fr') Mailpath: (mailpath) : typeset -a mailpath for i in ~/Mail/Lists/*(.); do mailpath[$#mailpath+1]="${i}?You have new mail in ${i:t}." done (globbing) : for com in alias expr find mattrib mcopy mdir mdel which; alias $com="noglob $com" bashprompt zsh bash2zshprompt zsh Misc . (t)csh zsh c2z (aliases) csh zsh . csh csh . zsh . . (title) (hardstatus) XTerm GNU Screen (prompt) zsh : function title { if [[ $TERM == "screen" ]]; then # Use these two for GNU Screen: print -nR $' 33k'$1$' 33'\ print -nR $' 33]0;'$2$'' elif [[ $TERM == "xterm" || $TERM == "rxvt" ]]; then # Use this one instead for XTerms: print -nR $' 33]0;'$*$'' fi } function precmd { title zsh "$PWD" } function preexec { emulate -L zsh local -a cmd; cmd=(${(z)1}) title $cmd[1]:t "$cmd[2,-1]" } ~/.screenrc hardstatus : caption always "%3n %t%? (%u)%?%?: %h%?" : $LINENO $RANDOM $SECONDS $COLUMNS $HISTCHARS $UID $EUID $GID $EGID $USERNAME $fignore $mailpath $cdpath http://www.zsh.org Zsh https://zsh.sourceforge.io http://sourceforge.net/projects/zsh From Bash to Z Shell: Conquering the Command Line http://www.bash2zsh.com <> ( Zsh) Sven Guckes Julius Plenz http://zshbuch.org http://www.zsh.org/mla (ZSH-FAQ) https://zsh.sourceforge.io/FAQ/zshfaq.html https://zsh.sourceforge.io/Guide ZSH ( ) https://web.archive.org/web/20160304135622/http://zshwiki.org/home ;) http://stchaz.free.fr/mouse.zsh ZSH http://aperiodic.net/phil/prompt ft zsh http://bewatermyfriend.org/tag/zsh zsh ft https://gitlab.com/ft/etc-zsh ZSH Adam http://www.adamspiers.org/computing/zsh ZSH Zzapper ( ) https://web.archive.org/web/20190517011103/http://www.rayninfo.co.uk/tips/zshtips.html Zsh Christian Schneider http://www.strcat.de/zsh zsh-lovers http://grml.org/zsh IRC #zsh at irc.freenode.org Z shell ( zsh-lovers) http://www.bash2zsh.com/zsh_refcard/refcard.pdf (AUTHORS) Michael Prokop Christian strcat Schneider Matthias Kopfermann . zsh zsh ( zsh-users zsh-workers) zsh-Wiki . . ! : Andrew 'zefram' Main - http://www.fysh.org/~zefram Barton E. Schaefer - http://www.well.com/user/barts Matthias Kopfermann - http://www.guckes.net/zsh/lover.html Oliver Kiddle - http://people.freenet.de/opk Paul Falstad - http://www.falstad.com Peter Stephenson - http://homepage.ntlworld.com/p.w.stephenson Richard Coleman Stephane Chazelas - http://stephane.chazelas.free.fr Sven Guckes - http://www.guckes.net Sven Wischnowsky - http://w9y.de zsh: zsh Zsh zshall Z zshbuiltins Zsh zshcalsys zsh zshcompctl zsh zshcompsys Zsh zshcompwid Zsh zshcontrib zsh zshexpn Zsh zshmisc zshmodules Zsh zshoptions Zsh zshparam Zsh zshroadmap zsh zshtcpsys tcp Zsh zshzle Zsh zshzftpsys FTP Zsh zshall : man zshcontrib ! : From Bash to Z Shell Oliver Kiddle Jerry Peck Peter Stephenson. ISBN: 1590593766. - bash2zsh.com LINKS . (BUGS) . . https://github.com/grml/zsh-lovers . ! (COPYRIGHT) (C) Michael Prokop Christian Schneider Matthias Kopfermann . 12/04/2024 ZSH-LOVERS(1)