Bash'dan zsh'ye hareket [kapalı]

141

Ben zsh övgüleri sık sık rastlamak gibi bash zsh hareket etmeyi düşünüyorum. Tecrübeli bir komut satırı kullanıcısıyım ve temellerin hemen hemen aynı olduğunu farz ediyorum, bu yüzden hareket etmenin faydalarını ve herhangi bir yakalamanın farkında olmak için tavsiye arıyorum.

Lütfen cevap başına bir tavsiyede bulunun. Geriye dönüp, her şeyi bir seferde öğrenmeye çalışmak yerine sabit bir hızda kabuk kullanmam için fazladan bilgi parçasını entegre edebileceğim ısırma büyüklüğünde parçalar arıyorum.

    
sordu Hamish Downer 07.08.2010 14:40

10 cevap

93

Söylediğiniz gibi, zsh , bash 'ye birçok açıdan benzer. % Co_de% dosyasında bulamayacağınız bazı özellikler var ve bunlar güçlü yollarla genişletilebilir. Bir tür devrim olarak hareket etmeyi değil, günlük işinizde size yardımcı olacak bir dizi evrimsel adım olarak düşünmeyin. İşte bash 'sindeki bazı ipuçları. Tek parça tavsiyeyi tercih ettiğini söylemesine rağmen, bu yazı uzunca bir listedir. Yine de noktaları tek tek gözden geçirmek iyi bir fikirdir. Sadece ilginç kodları .zshrc 'ya ekleyin ve ~/.zshrc ile yeniden yükleyin. Son ipucu: source ~/.zshrc 'nin varsayılan ("Emacs") klavye kısayol tuşlarının tuş vuruşlarını öğrenin: zsh . % Co_de% değerini iki ayrı tuşa basarak değiştirebilirsiniz: ^A ^E ^W Alt-F Alt-B Alt-P ^L ^R , Alt Alt-P değerine eşdeğerdir.

Bu size daha kapsamlı bir sekme tamamlamanızı sağlar.

autoload -U compinit
compinit

Her iki uçtan sekme tamamlandı.

setopt completeinword

Sekme tamamlanması büyük / küçük harf duyarlı olmalıdır.

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

Killall için daha iyi tamamlama.

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

"Sözcük" tanımını değiştirir, ör. ^ 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 kabuklar için bir tarih; 10.000 kayıt saklayın. Bu, bunu ESC vb için son kez kullandığınız komutları bulmak için kullanışlı bir bellek yardımcısı haline getirir. Alt-P (bunun gibi başlayan komutu bulun) ve ^ R (geçmişi aratın) liberal olarak kullanın.

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

ls ** / * .txt (tüm metin dosyalarını bul), P gibi tüm genişletilmiş globbing işlevlerini etkinleştirir ("ile başlayanlar da dahil olmak üzere tüm dosyaları göster"). Daha fazla bilgi edinmek için ./configure , "FILENAME GENERATION" bölümüne gidin.

# superglobs
setopt extendedglob
unsetopt caseglob

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

setopt interactivecomments # pound sign in interactive prompt

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

setopt auto_cd

Güzel mesaj.

PS1='[%T] %[email protected]%m:%~# '

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

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ı açtığına karar verirken yararlıdır.

function apt-list-packages {
  dpkg-query -W --showformat='${Installed-Size} ${Package} ${Status}\n' | grep -v deinstall | sort -n | awk '{print " "}'
}
    
verilen cevap loevborg 08.08.2010 19:50
14

Kitabı Bash'tan Z Kabuğuna tavsiye ederim. Kabuğunuzu değiştirmek için ihtiyacınız olan tüm tavsiyelere sahiptir. Her iki kabuğun farklılıklarını açıklar ve yeni bir zsher için kolaylaştırır.

    
verilen cevap qbi 07.08.2010 22:36
8

İşte benim .zshrc ve bu en önemli şey! zsh, kullanabileceğiniz birçok seçeneğiniz var, bu yüzden ağdaki tüm örneklere bakın veya dokümanları Zsh ana sayfasında okuyun. .

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

Btw, buradaki birkaç örnekte her yerde sekme karşılaştırma yapmayı deneyin:

mplayer -a[tab]

şunun gibi bir şey gösterecektir:

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

Eğer parolasız ssh-keys veya ssh-agent kullanırsanız, uzak dosyaları gruplandırmak için yararlı olabilirsiniz:

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

Listeyi aldıktan sonra, farklı olasılıklar arasında geçiş yapmak için sekme tuşuna daha fazla basabilirsiniz.

Ama uyar, bu kabuk seni tembelleştirecek ve standart bir kabuğun aptal ve sinir bozucu olduğunu hissettirecek!

    
verilen cevap LassePoulsen 07.08.2010 17:42
5

Özellikle kullanışlı olan genişletilmiş glob'lerden bazıları:

1- rmdir *(/^F) - mevcut dizinin altındaki boş olmayan tüm dizinleri silin

% 2-% co_de - son iki günde değiştirilen bu regex dosyasını arayın

% 3-% co_de - grubun sahip olduğu ve grup yazılabilir olmayan dosyaları grup yazılabilir yap

Evet, tabiki bunu grep traceback /srv/log/**/*(.m-2) ile yazabilirsiniz, ancak bu işlem daha kolay. Her ikisi de komut satırına genişletildikleri için adil olmak için iki dezavantajı var: eğer binlerce dosyayla eşleşirse, komut satırı çok uzun sürecek ve bu da başarısız olacak ve ikincisi tüm dosyalar bulunacak. dosya çalışmaya başlamadan önce.

(Henüz açık değilse chmod g+w **/*(U^I) 'ye ihtiyacınız olacak)

    
verilen cevap poolie 15.10.2010 03:21
4

Bash hakkında pek bir şey bilmiyorum, bu yüzden şikayet edemem. Zsh yapılandırma dosyasından bazı snippet'ler.

Bazı yapılandırmalar

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 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

İşlevler, 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 "" ]; then
    printf "" "${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 [email protected] style url.]"
}

_github_track() {
  _arguments \
    "--private[Use [email protected]: 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.]"
}
    
verilen cevap Pedro 02.09.2010 21:54
3

Aynı seyahatteyim:)

Şimdiye kadar, şeyin iyi bir yapılandırma dosyasına (.zshrc) sahip olduğunu öğrendim.

Bunu örnek olarak İşte , yorumlara bakın ve yolunuzu kesmek. Stackoverflow ve severphault ve aramak için iyi yerler.

İşte 'e henüz dalmadım ama serbest kalmam gereken çok fazla zamanım yok:)

    
verilen cevap tutuca 07.08.2010 16:41
3

Zsh'deki genişletilmiş globbing ve tekrarlayan globs hakkında bilgi edinin.

Zstyle hakkında biraz bilgi edinin ve çeşitli şeylerin (özellikle tamamlanma) nasıl yapılandırıldığını zstyle kullanarak ayarlamanıza izin verin.

İlişkilendirilmiş dizilere bakın. Ayrıca standart diziler (daha iyi için, bash'dan gelen farklılıklara dikkat edin!)

Düzenli ifadeler kullanıyorsanız, =~ 'ye (bash de sahiptir) bakın ve dikkate alın: setopt rematch_pcre

Zsh'in sihrinden biraz daha fazlasına dayanan komut dosyaları yazmaktan kaçının, çünkü kullanması harika olsa da, zsh yalnızca yazma amaçlı olma eğilimindedir. Çok fazla 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.

    
verilen cevap Phil P 02.09.2010 21:21
2

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

apt-get
action
autoclean        build-dep        clean            dselect-upgrade  install          remove           update           
autoremove       check            dist-upgrade     help             purge            source           upgrade          
    
verilen cevap hariharan022 14.11.2010 09:39
1

Bir görüşme kupası verdim ve birkaç kişiyi zsh'e dönüştürdüm. Github repo'yu (avantajlarım nelerdir) notlarımda hem başlangıç ​​hem de github'umdaki kendi zsh konfigürasyonumun bir kopyası ile devam ediyorum.

İşte

    
verilen cevap Rick 03.09.2010 03:56
0

Başka bir harika kaynak, zsh sevgilisi sayfasıdır. grml zsh site ).

    
verilen cevap qbi 07.08.2010 22:38

Etiketlerdeki diğer soruları oku