Bash'dan zsh'ye geçiş [kapalı]


143

Ben sık sık zsh'yi öven yazılarla karşılaştığım için bash'dan zsh'ye geçmeyi düşünüyorum. Tecrübeli bir komut satırı kullanıcısıyım ve temellerin hemen hemen aynı olduğunu varsayıyorum, bu nedenle hareket etmenin faydalarını ve dikkat edilmesi gereken her şeyi elde etmeyi tavsiye ediyorum.

Lütfen cevap başına sadece bir tavsiye veriniz. Her şeyi tek seferde öğrenmeye çalışmak yerine, geri gelebileceğim ve ilave bilgi bitlerini kabuk kullanımımla sabit bir tempoda birleştirebileceğim ısırık büyüklüğünde parçalar arıyorum.


8
Ubuntu'nun bulunamayan komutunu zsh ile bütünleştirmenin mümkün olup olmadığını bilmek isterim. Bu yüzden (ve daha birçok sıkıntı) bash'a geri döndüm.
Marius Gedminas


İki ilginç bağlantı daha: " ZSH SSS" zsh.sourceforge.net/FAQ & " ZSH senin arkadaşın" mikegrouchy.com/blog/zsh-is-your-friend.html
Shadok

3
@MariusGedminas: ( buradan ) zsh bunu destekliyor, ancak el ile etkinleştirmeniz gerekiyor. Sadece eklemek source /etc/zsh_command_not_foundadresinden Müşteri .zshrc.
naught101

Yanıtlar:


94

Dediğiniz gibi, zshbirçok bakımdan benzer bash. Bulamayacağınız bazı özelliklere sahiptir bashve güçlü yollarla genişletilebilir. Hareket etmeyi bir tür devrim olarak düşünmeyin, günlük işinizde size yardımcı olacak bir dizi evrimsel adım olarak düşünün. İşte benden bazı ipuçları .zshrc. Tek bir öneriyi tercih ettiğini söylesen de, bu yazı uzunca bir liste. Yine de noktalardan tek tek geçmek iyi bir fikirdir. Sadece ilginç bitleri ekleyin ~/.zshrcve yeniden yükleyin source ~/.zshrc. Son bir ipucu: bir tuş vuruşlarını öğrenmek zsh'ın varsayılan ( 'Emacs') klavye kısayolları: ^A ^E ^W Alt-F Alt-B Alt-P ^L ^R. Altİki ayrı tuş vuruşuyla değiştirebilirsiniz : Alt-Peşittir ESC P.


Bu size daha kapsamlı bir sekme tamamlama verir.

autoload -U compinit
compinit

Her iki uçtan sekme tamamlama.

setopt completeinword

Sekme tamamlama büyük / küçük harf duyarlı olmamalıdır.

zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'

Killall için daha iyi bir tamamlama.

zstyle ':completion:*:killall:*' command 'ps -u $USER -o cmd'

"Word" tanımını değiştirir, örneğin ^ W ile.

autoload select-word-style
select-word-style shell

Ls için renkler.

if [[ -x "`whence -p dircolors`" ]]; then
  eval `dircolors`
  alias ls='ls -F --color=auto'
else
  alias ls='ls -F'
fi

Ls için kısayollar.

alias ll='ls -l'
alias la='ls -a'

Tüm açık mermiler için bir tarih; 10.000 giriş saklayın. Bu, en son kullandığınız komutları ./configurevs. bulmak için faydalı bir hafıza yardımı haline getirir .

HISTFILE=~/.zhistory
HISTSIZE=SAVEHIST=10000
setopt sharehistory
setopt extendedhistory

Ls ** / *. Txt (tüm metin dosyalarını bul) gibi her türlü genişletilmiş globbing özelliğini etkinleştirir ls -d *(D)("." İle başlayanlar dahil tüm dosyaları göster). Daha fazla bilgi için man zshexpn, "FILENAME GENERATION" bölümüne bakın.

# superglobs
setopt extendedglob
unsetopt caseglob

Bu, geçmişinizdeki komutları çalıştırmadan hatırlamakta kullanışlıdır.

setopt interactivecomments # pound sign in interactive prompt

"Cd .." yerine "..", "cd / usr / include" yerine "/ usr / include" yazın.

setopt auto_cd

Güzel istemi.

PS1='[%T] %n@%m:%~# '

10 saniyeden uzun süren komutlar için CPU kullanım istatistiklerini görüntüleme

REPORTTIME=10

Ubuntu'da yoğun olarak kullandığınız bazı komutlar.

alias 'a=sudo aptitude'
alias 'ai=sudo aptitude install'
alias 'ar=sudo aptitude remove'
alias 'au=sudo aptitude update'
alias 'ag=sudo aptitude safe-upgrade'
alias 'as=apt-cache search'
alias 'aw=apt-cache show'

Boyutlarına göre sıralanmış paketleri listeler - hangi paketlerin disk alanınızı harcadığına karar verirken kullanışlıdır.

function apt-list-packages {
  dpkg-query -W --showformat='${Installed-Size} ${Package} ${Status}\n' | grep -v deinstall | sort -n | awk '{print $1" "$2}'
}

6
Yararlı olduğu için +1. -Ezlenik emacs savunuculuğu için -1!
Triptych

2
Ayrıca, zsh'a çok fazla eklenti ekleyen [ github.com/robbyrussell/oh-my-zshedia(oh-my-zsh) ' ı da beğenebilirsiniz .
RedPixel

14

Bash'tan Z Shell'e kitap tavsiye ederim . Kabuğunu değiştirmek için gereken tüm tavsiyelere sahiptir. Her iki kabuğun farklılığını açıklar ve yeni bir zsher için kolaylaştırır.


Kitap hem bash hem de zsh kullanıcıları için harika. Her bölümün "hem bash hem de zsh bunların hepsini yapabildiğini" ile başladığını ve daha sonra 30 sayfalık bir yol gösterdiğini ve işte burada "sadece zsh şeylerini"
Rick

8

İşte benim .zshrc ve bu en önemli şey! Zsh kullanabileceğiniz birçok seçenek var, bu yüzden net etrafındaki tüm örneklere bakın veya Zsh ana sayfasındaki belgeleri okuyun .

.Zshrc, komut satırının sağ tarafındaki zaman damgası dışında gerçekten harika şeyler içermiyor.

BTW, tab-compleation'ı denemeyi unutma, burada birkaç örnek:

mplayer -a[tab]

şöyle bir şey gösterecek:

mplayer -a
 -ac                 -- force usage of a specific audio codec
 -af                 -- activate audio filters
 -afm                -- force usage of a specific audio codec family
 -alang              -- select the DVD audio language
 -ao                 -- specify audio driver
 -aop                -- specify audio output filter

Ve eğer şifresiz ssh-keys veya ssh-agent kullanıyorsanız, uzaktaki dosyaları sekmesi için kullanışlıdır:

scp apollo:/home/user/[tab]
Desktop/ Documents/ Downloads/ Music/ Pictures/ Public/ Templates/ Videos/

Listeyi aldıktan sonra, farklı olasılıklar arasında dolaşmak için sekmeye daha fazla basabilirsiniz.

Ancak uyarılmalıdır, bu kabuk sizi tembelleştirir ve standart bir kabuğun aptal ve sinir bozucu olduğunu hissettirir!


5

Bir kaç tane özellikle faydalı genişletilmiş küre:

1- rmdir *(/^F)- geçerli dizindeki boş olmayan tüm dizinleri sil

2- grep traceback /srv/log/**/*(.m-2)- son iki günde değiştirilen dosyalarda bu regex'i arayın

3- chmod g+w **/*(U^I)- bana ait olan ve grup tarafından yazılamayan tüm dosyaları grup ile yazılabilir hale getirme

Evet, elbette bunu yazabilirsiniz, findancak bunu kapatmak kolaydır. İki dezavantajı var, her ikisi de komut satırına genişletiliyorsa, her ikisi de adil olmalı: komut satırı çok genişleyecektir. dosya çalışmaya başlamadan önce.

(Açık setopt extendedglobdeğilse, ihtiyacınız olacak )


4

Bash hakkında pek bir şey bilmiyorum, o yüzden telafi edemem. Benim zsh config dosyamdan bazı pasajlar.

Bazı config

HISTFILE=~/.zsh_history
HISTSIZE=1000
SAVEHIST=1000
REPORTTIME=10 # print elapsed time when more than 10 seconds
setopt NO_HUP
setopt NO_LIST_BEEP
setopt LOCAL_OPTIONS # allow functions to have local options
setopt LOCAL_TRAPS # allow functions to have local traps
setopt HIST_VERIFY
setopt SHARE_HISTORY # share history between sessions ???
setopt EXTENDED_HISTORY # add timestamps to history
setopt PROMPT_SUBST
setopt CORRECT
setopt COMPLETE_IN_WORD
setopt IGNORE_EOF

setopt APPEND_HISTORY # adds history
setopt INC_APPEND_HISTORY SHARE_HISTORY  # adds history incrementally and share it across sessions
setopt HIST_IGNORE_ALL_DUPS  # don't record dupes in history
setopt HIST_REDUCE_BLANKS
# Leave some chars out of the out of WORDCHARS so ^W acts more nicely 
WORDCHARS='*?_-[]~\!#$%^(){}<>|`@#$%^*()+:?'

İstemde Git

if [[ -n $SSH_CONNECTION ]]; then
  export PS1='%m:%3~$(git_info_for_prompt)%# '
else
  export PS1='%3~$(git_info_for_prompt)%# '
fi

Bazı kısayol tuşları, satırın başına bir miktar metin ekleyin.

insert_sudo     () { zle beginning-of-line; zle -U "sudo "         }
insert_apt      () { zle beginning-of-line; zle -U "sudo apt-get " }
insert_gem      () { zle beginning-of-line; zle -U "sudo gem "     }
insert_install  () { zle -U "install "     }

zle -N insert-sudo      insert_sudo
zle -N insert-apt       insert_apt
zle -N insert-gem       insert_gem
zle -N insert-install   insert_install

bindkey "^B" insert-gem
bindkey "^N" insert-install
bindkey "^k" insert-sudo
bindkey "^a" insert-apt

Fonksiyonlar, daha sonra ~ / .zsh / functions içinde saklıyorum.

Git_info_for_prompt

local g="$(git rev-parse --git-dir 2>/dev/null)"
if [ -n "$g" ]; then
  local r
  local b
  if [ -d "$g/../.dotest" ]
  then
    if test -f "$g/../.dotest/rebasing"
    then
      r="|REBASE"
    elif test -f "$g/../.dotest/applying"
    then
      r="|AM"
    else
      r="|AM/REBASE"
    fi
    b="$(git symbolic-ref HEAD 2>/dev/null)"
  elif [ -f "$g/.dotest-merge/interactive" ]
  then
    r="|REBASE-i"
    b="$(cat "$g/.dotest-merge/head-name")"
  elif [ -d "$g/.dotest-merge" ]
  then
    r="|REBASE-m"
    b="$(cat "$g/.dotest-merge/head-name")"
  elif [ -f "$g/MERGE_HEAD" ]
  then
    r="|MERGING"
    b="$(git symbolic-ref HEAD 2>/dev/null)"
  else
    if [ -f "$g/BISECT_LOG" ]
    then
      r="|BISECTING"
    fi
    if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
    then
      if ! b="tag: $(git describe --exact-match HEAD 2>/dev/null)"
      then
        b="$(cut -c1-7 "$g/HEAD")..."
      fi
    fi
  fi

  if [ -n "$1" ]; then
    printf "$1" "${b##refs/heads/}$r"
  else
    printf "[%s]" "${b##refs/heads/}$r"
  fi
fi

Bazı github seçenekleri

#compdef github

_github() {
  if (( CURRENT > 2 )); then
    # shift words so _arguments doesn't have to be concerned with second command
    (( CURRENT-- ))
    shift words
    # use _call_function here in case it doesn't exist
    _call_function 1 _github_${words[1]}
  else
    _values "github command" \
     "fetch[Fetch from a remote to a local branch.]" \
     "ignore[Ignore a SHA (from 'github network commits')]" \
     "fetch_all[Fetch all refs from a user]" \
     "info[Info about this project.]" \
     "browse[Open this repo in a web browser.]" \
     "home[Open this repo's master branch in a web browser.]" \
     "clone[Clone a repo.]" \
     "pull-request[Generate the text for a pull request.]" \
     "network[Project network tools.]" \
     "pull[Pull from a remote.]" \
     "track[Track another user's repository.]"
  fi
}

_github_pull() {
  _arguments \
    "--merge[Automatically merge remote's changes into your master.]"
}
_github_clone() {
  _arguments \
    "--ssh[Clone using the git@github.com style url.]"
}

_github_track() {
  _arguments \
    "--private[Use git@github.com: instead of git://github.com/.]" \
    "--ssh[Equivalent to --private.]"
}

_github_network() {
  if (( CURRENT > 2 )); then
    # shift words so _arguments doesn't have to be concerned with second command
    (( CURRENT-- ))
    shift words
    # use _call_function here in case it doesn't exist
    _call_function 1 _github_network_${words[1]}
  else
    _values "github network command" \
     "web[Open network in a web browser.]" \
     "list[List networked repositories.]" \
     "fetch[Fetched commits for a given networked repository.]" \
     "commits[List networked commits not pulled into this repo.]"
  fi
}

_github_network_commits() {
  _arguments \
    "--project[Filter commits on a certain project.]" \
    "--author[Filter commits on a email address of author.]" \
    "--common[Show common branch point.]" \
    "--nocache[Do not use the cached network data.]" \
    "--sort[How to sort : date(*), branch, author.]" \
    "--thisbranch[Look at branches that match the current one]" \
    "--applies[Filter commits to patches that apply cleanly.]" \
    "--limit[Only look through the first X heads - useful for really large projects]" \
    "--before[Only show commits before a certain date.]" \
    "--after[Only show commits after a certain date.]" \
    "--shas[Only show shas.]" \
    "--cache[Use the network data even if it's expired.]" \
    "--noapply[Filter commits to patches that do not apply cleanly.]"
}


3

Zsh'deki genişletilmiş küre ve özyinelemeli küre hakkında bilgi edinin.

Zstyle hakkında biraz bilgi edinin ve çeşitli şeylerin (özellikle tamamlama) zstyle kullanarak yapılandırmalarını nasıl ayarlamanıza izin verdiğini öğrenin.

İlişkisel dizilere bakın. Ayrıca standart diziler (bash'tan farklılığa dikkat edin!)

Düzenli ifadeler kullanıyorsanız, =~(hangi bash da vardır) 'a bakın ve şunları göz önünde bulundurun:setopt rematch_pcre

Zsh'nin sihrinden biraz fazlasına dayanan senaryolar yazmaktan kaçının, çünkü kullanımı fantastik olsa da, zsh sadece yazı yazma eğilimindedir. Çok daha fazlasını kullanıyorsanız, Python gibi bir dile ne zaman geçeceğinizi düşünün.

Zsh baştan çıkarıcıdır. Bu karanlık taraf. Hoşgeldiniz.


2

Büyük avantaj - birçok komut için önceden paketlenmiş tamamlama komut dosyaları ile mükemmel sekme tamamlama. İşte çıktısını gösteren bir örnek apt-get<TAB>:

apt-get
action
autoclean        build-dep        clean            dselect-upgrade  install          remove           update           
autoremove       check            dist-upgrade     help             purge            source           upgrade          

1

Bir çift görüşme yaptım ve birkaç kişiyi zsh'ye dönüştürdüm. Burada hem başlangıç ​​hem de kendi zsh config'imin bir kopyası ile birlikte notlarımın bir github reposunu (avantajları nelerdir) burada tutuyorum.

http://github.com/mitechie/zshrc


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.