Wechsel von bash nach zsh [geschlossen]

143

Ich denke darüber nach, von bash nach zsh zu wechseln, da ich oft auf Posts stoße, in denen zsh gelobt wird. Ich bin ein erfahrener Kommandozeilenbenutzer und gehe davon aus, dass die Grundlagen ziemlich gleich sind. Deshalb suche ich nach Ratschlägen, um die Vorteile des Bewegens zu nutzen, und nach Hinweisen, die ich beachten muss.

Bitte geben Sie nur einen Rat pro Antwort. Ich bin auf der Suche nach mundgerechten Stücken, in denen ich in regelmäßigen Abständen zusätzliche Informationen in meine Shell-Nutzung integrieren kann, anstatt zu versuchen, alles auf einmal zu lernen.

Hamish Downer
quelle
8
Ich würde gerne wissen, ob es möglich ist, Ubuntus nicht gefundenen Befehl in zsh zu integrieren. Aus diesem Grund bin ich zurück zu Bash gewechselt (und vielen anderen Ärgernissen).
Marius Gedminas
Zwei weitere interessante Links: "ZSH FAQ" zsh.sourceforge.net/FAQ & "ZSH ist dein Freund" mikegrouchy.com/blog/zsh-is-your-friend.html
Shadok
3
@MariusGedminas: ( von hier ) zsh unterstützt dies, aber Sie müssen es manuell aktivieren. Fügen source /etc/zsh_command_not_foundSie einfach zu Ihrem .zshrc.
Naught101

Antworten:

94

Wie Sie sagen, zshist in vielerlei Hinsicht ähnlich bash. Es hat einige Funktionen, die Sie nicht finden werden bash, und es kann auf mächtige Weise erweitert werden. Stellen Sie sich Bewegung nicht als eine Art Revolution vor, sondern als eine Reihe von Evolutionsschritten, die Sie bei Ihrer täglichen Arbeit unterstützen. Hier sind einige Hinweise von mir .zshrc. Obwohl Sie sagen, Sie bevorzugen einzelne Ratschläge, ist dieser Beitrag eine lange Liste. Trotzdem ist es eine gute Idee, die Punkte einzeln durchzugehen. Fügen Sie einfach die interessanten Teile hinzu ~/.zshrcund laden Sie mit source ~/.zshrc. Ein letzter Tipp: die Tastenanschläge von lernen zsh‚s Standard (‚Emacs‘) Tastaturkürzel: ^A ^E ^W Alt-F Alt-B Alt-P ^L ^R. Sie können Altdurch zwei separate Tastenanschläge ersetzen : Alt-Pentspricht ESC P.


Auf diese Weise erhalten Sie eine umfassendere Registerkartenergänzung.

autoload -U compinit
compinit

Tab Vervollständigung von beiden Enden.

setopt completeinword

Bei der Eingabe der Tabulatoren sollte die Groß- und Kleinschreibung nicht berücksichtigt werden.

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

Besserer Abschluss für killall.

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

Ändert die Definition von "Wort", zB mit ^ W.

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

Farben für ls.

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

Abkürzungen für ls.

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

Eine Geschichte für alle offenen Muscheln; Speichern Sie 10.000 Einträge. Dies macht dies zu einer nützlichen Speicherhilfe, um die Befehle zu finden, die Sie zuletzt für ./configureusw. verwendet haben. Verwenden Sie Alt-P (Suchbefehl, der so beginnt) und ^ R (Suche im Verlauf) großzügig.

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

Aktiviert alle Arten von erweiterten Globen, wie z. B. ls ** / *. Txt (alle Textdateien suchen) ls -d *(D)(alle Dateien anzeigen, einschließlich der Dateien, die mit "." Beginnen ). Weitere man zshexpnInformationen finden Sie im Abschnitt "FILENAME GENERATION".

# superglobs
setopt extendedglob
unsetopt caseglob

Dies ist nützlich, um sich Befehle in Ihrem Verlauf zu merken, ohne sie auszuführen.

setopt interactivecomments # pound sign in interactive prompt

Geben Sie ".." anstelle von "cd ..", "/ usr / include" anstelle von "cd / usr / include" ein.

setopt auto_cd

Nette Aufforderung.

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

Zeigt die CPU-Auslastungsstatistik für Befehle an, die länger als 10 Sekunden dauern

REPORTTIME=10

Einige Befehle, die Sie häufig in Ubuntu verwenden.

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'

Listet Pakete nach ihrer Größe sortiert auf. Dies ist hilfreich, wenn Sie entscheiden, welche Pakete Speicherplatz beanspruchen.

function apt-list-packages {
  dpkg-query -W --showformat='${Installed-Size} ${Package} ${Status}\n' | grep -v deinstall | sort -n | awk '{print $1" "$2}'
}
Loevborg
quelle
6
+1 für nützlich sein. -1 für heimliche Emacs Fürsprache!
Triptychon
2
Sie könnten auch [ github.com/robbyrussell/oh-my-zsh[(oh-my-zsh) mögen, wodurch zsh eine Menge Plugins hinzugefügt werden.
RedPixel
14

Ich würde das Buch From bash to Z Shell empfehlen . Es enthält alle Ratschläge, die Sie zum Wechseln Ihrer Shell benötigen. Es erklärt die Unterschiede beider Schalen und macht es einem neuen Zsher leicht.

qbi
quelle
Das Buch eignet sich sowohl für Bash- als auch für Zsh-Benutzer. Man muss lieben, wie jedes Kapitel mit "sowohl bash als auch zsh können das alles" beginnt und dann zu weiteren 30 Seiten mit "und hier ist das einzige Zeug von zsh" führt
Rick
8

Hier ist meine .zshrc und das ist das Wichtigste! zsh hat viele Möglichkeiten, die Sie nutzen können. Schauen Sie sich einige Beispiele im Internet an oder lesen Sie die Dokumentation auf der Zsh-Homepage .

Meine .zshrc enthält keine wirklich coolen Dinge außer einem Zeitstempel auf der rechten Seite der Befehlszeile.

Übrigens, denken Sie daran, hier einige Beispiele für Tab-Compleation zu finden:

mplayer -a[tab]

wird so etwas zeigen:

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

Und wenn Sie passwortlose SSH-Schlüssel oder SSH-Agenten verwenden, ist es möglicherweise nützlich, entfernte Dateien zu tab-vervollständigen:

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

Nachdem Sie die Liste erhalten haben, können Sie die Tabulatortaste mehrmals drücken, um durch die verschiedenen Möglichkeiten zu blättern.

Aber seien Sie gewarnt, diese Shell wird Sie faul machen und Ihnen das Gefühl geben, dass eine Standard-Shell dumm und nervig ist!

LassePoulsen
quelle
5

Einige besonders nützliche erweiterte Globs:

1- rmdir *(/^F)- Löschen Sie alle nicht leeren Verzeichnisse unter dem aktuellen Verzeichnis

2- grep traceback /srv/log/**/*(.m-2)- Suchen Sie nach diesem regulären Ausdruck in Dateien, die in den letzten zwei Tagen geändert wurden

3- chmod g+w **/*(U^I)- Alle Dateien, deren Eigentümer ich bin und die nicht von einer Gruppe beschreibbar sind, müssen von einer Gruppe beschreibbar sein

Ja, natürlich können Sie dies mit schreiben, findaber dies ist einfacher abzusausen. Es hat zwei Nachteile, um ehrlich zu sein, beide, weil sie alle auf die Befehlszeile erweitert wurden: Wenn sie mit vielen tausend Dateien übereinstimmt, wird die Befehlszeile zu lang und dies schlägt fehl, und zweitens werden alle Dateien gefunden bevor die Datei gestartet wird.

(Du wirst brauchen, setopt extendedglobwenn das noch nicht so ist)

Poolie
quelle
4

Ich weiß nicht so viel über Bash, also kann ich nicht mithalten. Einige Schnipsel aus meiner zsh-Konfigurationsdatei.

Einige Konfig

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

Git in der Eingabeaufforderung

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

Bei einigen Tastenkombinationen fügen Sie am Anfang der Zeile Text ein.

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

Die Funktionen speichere ich dann in ~ / .zsh / functions

Die 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

Einige Github-Optionen

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

quelle
3

Ich bin auf der gleichen Reise :)

Bisher habe ich festgestellt, dass das Ding eine gute Konfigurationsdatei (.zshrc) haben soll.

Nehmen Sie dieses Beispiel http://matt.blissett.me.uk/linux/zsh/zshrc , schauen Sie sich die Kommentare an und hacken Sie sich um. Stackoverflow und Severphault sowie gute Suchmöglichkeiten.

Ich muss noch in http://dotfiles.org/.zshrc eintauchen , aber ich habe nicht so viel Zeit zu verlieren :)

tutuca
quelle
3

Erfahren Sie mehr über die erweiterten Globbing- und rekursiven Globs in zsh.

Erfahren Sie etwas über zstyle und wie Sie mithilfe verschiedener Dinge (insbesondere der Fertigstellung) die Konfiguration mit zstyle anpassen können.

Schauen Sie sich die assoziativen Arrays an. Auch die Standard-Arrays (Vorsicht vor den Unterschieden zu Bash, zum Besseren!)

Wenn Sie reguläre Ausdrücke verwenden, =~prüfen Sie (welche Bash auch hat) und berücksichtigen Sie:setopt rematch_pcre

Vermeiden Sie es, Skripte zu schreiben, die mehr als nur ein wenig von zshs Magie abhängen, da zsh zwar fantastisch zu verwenden ist, aber dazu neigen kann, nur zu schreiben. Wenn Sie zu viel verwenden, überlegen Sie, wann Sie zu einer Sprache wie Python wechseln sollten.

Zsh ist verführerisch. Es ist die dunkle Seite. Herzlich willkommen.

Phil P
quelle
2

Großer Vorteil - Hervorragende Registerkartenvervollständigung mit vorgefertigten Vervollständigungsskripten für viele Befehle. Hier ist ein Beispiel für die Ausgabe von apt-get<TAB>:

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

Ich habe ein paar Vorträge gehalten und mehrere Leute zu zsh konvertiert. Ich behalte ein Github-Repo meiner (was sind die Vorteile) Notizen zusammen mit einem Starter und einer Kopie meiner eigenen zsh-Konfiguration in Github hier.

http://github.com/mitechie/zshrc

Rick
quelle