it-swarm.dev

Přechod z bash na zsh

Uvažuji o přechodu z bash na zsh, protože často narazím na příspěvky chválící ​​zsh. Jsem zkušený uživatel příkazového řádku a předpokládám, že základy jsou do značné míry stejné, takže hledám radu, jak získat výhody plynoucí z pohybu, a všechny případy, o kterých je třeba vědět.

Uveďte prosím jen jednu radu na odpověď. Hledám kousky velikosti kousnutí, kde se mohu vrátit a integrovat další kousky informací do mého použití Shell stabilním tempem, místo abych se to pokusil naučit vše najednou.

146
Hamish Downer

Jak říkáte, zsh je v mnoha ohledech podobný bash. Má některé funkce, které nenajdete v bash, a lze jej efektivně rozšířit. Nemyslete na to, že byste se pohybovali jako určitý druh revoluce, ale spíše jako řada evolučních kroků, které vám pomohou při každodenní práci. Zde je několik rad z mého .zshrc. I když říkáte, že dáváte přednost jednotlivým radám, tento příspěvek je dlouhý seznam. Přesto je dobrý nápad projít body jeden po druhém. Stačí přidat zajímavé bity na váš ~/.zshrc A znovu načíst pomocí source ~/.zshrc. Poslední tip: Naučte se klávesové zkratky výchozích klávesových zkratek zsh ("Emacs"): ^A ^E ^W Alt-F Alt-B Alt-P ^L ^R. Alt můžete nahradit dvěma samostatnými klávesovými zkratkami: Alt-P Je ekvivalentní s ESCP.


Tím získáte rozsáhlejší vyplnění karty.

autoload -U compinit
compinit

Dokončení karty z obou konců.

setopt completeinword

Dokončení karty by nemělo rozlišovat velká a malá písmena.

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

Lepší dokončení pro killall.

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

Mění definici slova „Word“, např. s ^ W.

autoload select-Word-style
select-Word-style Shell

Barvy pro ls.

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

Klávesové zkratky pro ls.

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

Jedna historie pro všechny otevřené náboje; uložit 10 000 záznamů. Díky tomu je užitečná paměťová pomůcka k nalezení příkazů, které jste použili naposledy pro ./configure Atd. Liberálně použijte Alt-P (příkaz find, který začíná takto) a ^ R (search in history).

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

Povoluje všechny druhy rozšířeného globpingu, jako je ls **/*. Txt (najděte všechny textové soubory), ls -d *(D) (zobrazit všechny soubory včetně těch, které začínají na „.“). Chcete-li se dozvědět více, přejděte na man zshexpn, Oddíl „GENERACE SOUBORŮ“.

# superglobs
setopt extendedglob
unsetopt caseglob

To je užitečné pro zapamatování příkazů ve vaší historii, aniž by byly provedeny.

setopt interactivecomments # pound sign in interactive Prompt

Zadejte „..“ místo „cd ..“, „/ usr/include“ místo „cd/usr/include“.

setopt auto_cd

Hezká výzva.

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

Zobrazit statistiky využití CPU pro příkazy trvající déle než 10 sekund

REPORTTIME=10

Některé příkazy, které v Ubuntu hojně používáte.

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'

Vypíše balíčky seřazené podle jejich velikosti - užitečné při rozhodování, které balíčky zabírají místo na disku.

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

Doporučil bych knihu Z bash do Z Shell . Má všechny rady, které potřebujete pro přepínání Shell. Vysvětluje rozdíly obou skořápek a usnadňuje nový zsher.

14
qbi

Tady je moje . Zshrc a to je ta nejvýznamnější věc! zsh má mnoho možností, které můžete použít, takže se podívejte na některé příklady ze sítě nebo si přečtěte dokumentaci na domovská stránka Zsh .

Moje .zshrc neobsahuje žádné opravdu skvělé věci kromě časového razítka na pravé straně příkazového řádku.

Btw, nezapomeňte vyzkoušet doplňování karet všude tam, kde je několik příkladů:

mplayer -a[tab]

ukáže něco takového:

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

A pokud používáte bezšňůrové ssh-klíče nebo ssh-agenta, může být užitečné dokončit vzdálené soubory pomocí tabelátoru:

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

Po získání seznamu můžete pak opakovaně stisknout kartu a procházet různými možnostmi.

Ale pozor, tento Shell vás bude líný a bude vás cítit, že standardní Shell je hloupý a nepříjemný!

8
LassePoulsen

Několik konkrétně užitečných rozšířených globů:

  1. rmdir *(/^F) - smaže všechny neprázdné adresáře v aktuálním adresáři

  2. grep traceback /srv/log/**/*(.m-2) - hledejte tento regex v souborech upravených za poslední dva dny

  3. chmod g+w **/*(U^I) - učiní všechny soubory ve mém vlastnictví, které nelze zapisovat do skupin, zapisovat do skupin

Ano, samozřejmě, můžete to napsat pomocí find, ale je snazší to odříznout. Má dvě nevýhody, abych byl spravedlivý, a to jak s tím, že se všechny rozbalí na příkazový řádek: pokud se shoduje s mnoha tisíci souborů, příkazový řádek bude příliš dlouhý a toto selže a zadruhé budou nalezeny všechny soubory. před spuštěním souboru.

(Budeš potřebovat setopt extendedglob pokud to ještě není zapnuto)

5
poolie

Nevím tolik o bash, takže nemůžu konkurovat. Některé úryvky z mého konfiguračního souboru zsh.

Nějaká konfigurace

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='*?_-[]~\!#$%^(){}<>|`@#$%^*()+:?'

Dostaňte výzvu

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

Několik klávesových zkratek, vložte na začátek řádku nějaký text.

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

Funkce, pak uložím do ~/.zsh/function

The 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

Některé možnosti githubu

#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.]"
}
4
Pedro

Jsem na stejné cestě :)

Zatím jsem zjistil, že jde o dobrý konfigurační soubor (.zshrc).

Vezměme si toto jako příklad http://matt.blissett.me.uk/linux/zsh/zshrc , podívejte se na komentáře a proplujte se. Stackoverflow a severphault a dobrá místa k vyhledávání také.

Ještě se musím ponořit do http://dotfiles.org/.zshrc , ale nemám tolik času ztratit :)

3
tutuca

Další informace o rozšířených globingových a rekurzivních globách v zsh.

Dozvíte se něco o zstyle a jak různé věci (zejména dokončení) umožňují vyladit jejich konfiguraci pomocí zstyle.

Podívejte se do asociativních polí. Také standardní pole (pozor na rozdíly od bash, k lepšímu!)

Pokud používáte regulární výrazy, podívejte se do =~ (který bash také má) a zvažte: setopt rematch_pcre

Vyhněte se psaní skriptů, které závisí na více než malé části magie zsh, protože i když je fantastické použití, zsh může mít sklon k tomu, aby byl pouze pro psaní. Pokud používáte mnohem více, přemýšlejte o tom, kdy přepnout na jazyk, jako je Python.

Zsh je svůdný. Je to temná stránka. Vítejte.

3
Phil P

Velká výhoda - vynikající vyplnění karty s předem zabalenými skripty pro dokončení mnoha příkazů. Zde je příklad znázorňující výstup apt-get<TAB>:

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

Dal jsem kupé rozhovorů a převedl několik lidí na zsh. Udržuji github repo svých (jaké jsou výhody) poznámky spolu se startérem a kopií své vlastní zsh konfigurace v githubu.

http://github.com/mitechie/zshrc

1
Rick

Dalším velkým zdrojem je stránka milenců zsh (pochází z grml zsh web ).

0
qbi