Przejście z bash do zsh [zamknięte]


143

Zastanawiam się nad przejściem z bash na zsh, ponieważ często spotykam posty chwalące zsh. Jestem doświadczonym użytkownikiem wiersza poleceń i zakładam, że podstawy są prawie takie same, więc szukam porady, aby uzyskać korzyści z przeprowadzki i innych problemów, o których należy pamiętać.

Podaj tylko jedną radę na odpowiedź. Szukam kawałków wielkości kęsa, w których mogę wrócić i zintegrować dodatkowe fragmenty informacji z użyciem mojej powłoki w stałym tempie zamiast próbować nauczyć się tego wszystkiego za jednym razem.


8
Chciałbym wiedzieć, czy możliwe jest zintegrowanie polecenia Ubuntu z nieznajomym z zsh. Z tego powodu wróciłem do bash (i wielu innych niedogodności).
Marius Gedminas


Dwa bardziej interesujące linki: "ZSH FAQ" zsh.sourceforge.net/FAQ & "ZSH jest twoim przyjacielem" mikegrouchy.com/blog/zsh-is-your-friend.html
Shadok

3
@MariusGedminas: ( stąd ) zsh obsługuje to, ale musisz włączyć to ręcznie. Po prostu dodaj source /etc/zsh_command_not_founddo swojego .zshrc.
naught101

Odpowiedzi:


94

Jak mówisz, zshpod wieloma względami jest podobny bash. Ma pewne funkcje, których nie znajdziesz bash, i można go rozbudować w potężny sposób. Nie myśl o poruszaniu się jako o rodzaju rewolucji, a raczej o serii kroków ewolucyjnych, które pomogą ci w codziennej pracy. Oto kilka wskazówek ode mnie .zshrc. Chociaż twierdzisz, że wolisz pojedyncze porady, ten post jest długą listą. Nadal dobrze jest przejrzeć punkty jeden po drugim. Po prostu dodaj interesujące bity ~/.zshrci załaduj ponownie source ~/.zshrc. Ostateczna wskazówka: nauczyć znaki wpisywane zsh„s (domyślnie)«Emacs»skrótów klawiszowych: ^A ^E ^W Alt-F Alt-B Alt-P ^L ^R. Możesz zastąpić Altgo dwoma osobnymi naciśnięciami klawiszy: Alt-Podpowiada to ESC P.


Zapewnia to bardziej rozbudowane uzupełnianie kart.

autoload -U compinit
compinit

Uzupełnianie tabulatorów z obu końców.

setopt completeinword

Uzupełnianie tabulatorów nie uwzględnia wielkości liter.

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

Lepsze zakończenie dla killall.

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

Zmienia definicję „słowa”, np. Za pomocą ^ W.

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

Kolory dla ls.

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

Skróty dla ls.

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

Jedna historia dla wszystkich otwartych powłok; zapisz 10.000 wpisów. To sprawia, że ​​jest to przydatna pomoc w pamięci, aby znaleźć polecenia, których użyłeś ostatnio ./configureitp. Użyj Alt-P (znajdź polecenie, które zaczyna się w ten sposób) i ^ R (szukaj w historii) swobodnie.

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

Umożliwia wszystkie rodzaje rozszerzonego globowania, takie jak ls ** / *. Txt (znajdź wszystkie pliki tekstowe), ls -d *(D)(pokaż wszystkie pliki, w tym te zaczynające się od „.”). Aby dowiedzieć się więcej, przejdź do man zshexpnsekcji „GENERACJA NAZWY PLIKU”.

# superglobs
setopt extendedglob
unsetopt caseglob

Jest to przydatne do zapamiętywania poleceń w historii bez ich wykonywania.

setopt interactivecomments # pound sign in interactive prompt

Wpisz „..” zamiast „cd ..”, „/ usr / include” zamiast „cd / usr / include”.

setopt auto_cd

Miły podpowiedź.

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

Wyświetl statystyki użycia procesora dla poleceń trwających dłużej niż 10 sekund

REPORTTIME=10

Niektóre polecenia, których często używasz w Ubuntu.

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'

Wyświetla listę pakietów posortowanych według ich wielkości - przydatne przy podejmowaniu decyzji, które pakiety zajmują miejsce na dysku.

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

6
+1 za bycie przydatnym. -1 za ukradkiem rzecznictwo emacsa!
Tryptyk

2
Możesz także polubić [ github.com/robbyrussell/oh-my-zsh](oh-my-zsh), który dodaje wiele wtyczek do zsh.
RedPixel

14

Poleciłbym książkę From bash to Z Shell . Zawiera wszystkie porady potrzebne do zmiany powłoki. Wyjaśnia różnice między obiema powłokami i ułatwia nowy Zsher.


Książka jest świetna zarówno dla użytkowników bash, jak i zsh. Musisz pokochać sposób, w jaki każdy rozdział zaczyna się od „zarówno bash, jak i zsh mogą to wszystko zrobić”, a następnie prowadzi do kolejnych 30 stron „i oto rzeczy tylko zsh”
Rick

8

Oto mój .zshrc i to jest najważniejsze. Zsh ma wiele opcji, z których możesz skorzystać, więc spójrz na niektóre przykłady w sieci lub przeczytaj dokumentację na stronie głównej Zsh .

Mój .zshrc nie zawiera żadnych naprawdę fajnych rzeczy poza znacznikiem czasu po prawej stronie wiersza poleceń.

Przy okazji, pamiętaj, aby wypróbować tabulację co kilka przykładów tutaj:

mplayer -a[tab]

pokaże coś takiego:

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 jeśli używasz ssh-klucze lub ssh-agent bez hasła, może być przydatne do uzupełniania zdalnych plików tabulatorami:

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

Po uzyskaniu listy możesz nacisnąć klawisz Tab więcej razy, aby przełączać się między różnymi możliwościami.

Ale uwaga, ta skorupa sprawi, że będziesz leniwy i poczujesz, że standardowa skorupa jest głupia i denerwująca!


5

Kilka szczególnie użytecznych rozszerzonych globów:

1- rmdir *(/^F)- usuń wszystkie niepuste katalogi w bieżącym katalogu

2- grep traceback /srv/log/**/*(.m-2)- poszukaj tego wyrażenia regularnego w plikach zmodyfikowanych w ciągu ostatnich dwóch dni

3- chmod g+w **/*(U^I)- spraw, aby wszystkie pliki, które są własnością mnie i nie były zapisywane w grupie, były zapisywalne w grupie

Tak, oczywiście, możesz to napisać, findale łatwiej to oderwać. Ma dwie wady, szczerze mówiąc, obie związane z rozszerzeniem ich do wiersza poleceń: jeśli pasuje do wielu tysięcy plików, wiersz polecenia będzie zbyt długi i to się nie powiedzie, a po drugie wszystkie pliki zostaną znalezione zanim plik zacznie działać.

(Będziesz potrzebować, setopt extendedglobjeśli to jeszcze nie jest włączone)


4

Nie wiem tyle o bashu, więc nie mogę pisać. Niektóre fragmenty z mojego pliku konfiguracyjnego zsh.

Trochę konfiguracji

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

Podpowiedź

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

Niektóre skróty, wstaw na początku wiersza tekst.

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

Funkcje, które następnie przechowuję w ~ / .zsh / funkcje

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

Niektóre opcje github

#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

Dowiedz się o rozszerzonym globowaniu i rekurencyjnych globach w zsh.

Dowiedz się trochę o zstyle i o tym, jak różne rzeczy (zwłaszcza uzupełnianie) pozwalają dostroić ich konfigurację za pomocą zstyle.

Spójrz na tablice asocjacyjne. Również standardowe tablice (uważaj na różnice od bash, na lepsze!)

Jeśli używasz wyrażeń regularnych, zajrzyj do =~(która również ma bash) i zastanów się:setopt rematch_pcre

Unikaj pisania skryptów, które zależą od więcej niż odrobiny magii zsh, ponieważ chociaż jest fantastyczny w użyciu, zsh może mieć tendencję do bycia tylko do zapisu. Jeśli używasz zbyt dużo, zastanów się, kiedy przejść na język taki jak Python.

Zsh jest uwodzicielski. To jest ciemna strona. Witamy.


2

Duża korzyść - doskonałe uzupełnianie tabulatorów dzięki gotowym skryptom uzupełniania dla wielu poleceń. Oto przykład pokazujący wynik apt-get<TAB>:

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

1

Dałem coupe rozmowy i przekonałem kilka osób do zsh. Trzymam repozytorium github moich (jakie są zalety) notatek wraz z starterem i kopią mojej własnej konfiguracji zsh w github tutaj.

http://github.com/mitechie/zshrc


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.