Frage Von bash zu zsh [geschlossen]


Ich überlege, von bash zu zsh zu wechseln, da ich oft auf Beiträge gestoßen bin, die zsh loben. Ich bin ein erfahrener Befehlszeilen-Benutzer und ich gehe davon aus, dass die Grundlagen ziemlich gleich sind, also suche ich nach Ratschlägen, um die Vorteile des Verschiebens zu bekommen, und alle möglichen Fehler zu beachten.

Bitte geben Sie nur einen Tipp pro Antwort. Ich bin auf der Suche nach mundgerechten Brocken, in denen ich zurückkommen und zusätzliche Informationen in meinen Shell-Verbrauch integrieren kann, anstatt zu versuchen, alles auf einmal zu lernen.


141
2017-08-07 12:40


Ursprung


Ich würde gerne wissen, ob es möglich ist, Ubuntus Befehl-nicht-gefunden mit zsh zu integrieren. Ich bin deswegen (und vielen anderen Ärgernissen) zurück in die Bash gegangen. - Marius Gedminas
Verwandte Themen auf anderen Stack Exchange-Sites: Lohnt sich der Wechsel zu zsh für den gelegentlichen Gebrauch?  Was ist in deiner .zshrc?  Welche zsh-Funktionen verwenden Sie?  Einzigartige Eigenschaften von bash im Vergleich zu zsh  Gibt es einen Grund, bash über zsh zu verwenden?  Welche Features gibt es in zsh und welche fehlen in Bash oder umgekehrt? - Gilles
Zwei weitere interessante Links: "ZSH FAQ" zsh.sourceforge.net/FAQ & "ZSH ist dein Freund" mikegrouchy.com/blog/zsh-is-your-friend.html - Shadok
@MariusGedminas: (von hier) zsh unterstützt dies, aber Sie müssen es manuell aktivieren. Einfach hinzufügen source /etc/zsh_command_not_found zu deinem .zshrc. - naught101


Antworten:


Wie du sagst, zsh ist in vieler Hinsicht ähnlich bash. Es hat einige Funktionen, die Sie nicht finden werden bashund es kann auf kraftvolle Weise erweitert werden. Denken Sie nicht daran, sich als eine Art Revolution zu bewegen, sondern als eine Folge von evolutionären Schritten, die Ihnen bei Ihrer täglichen Arbeit helfen. Hier sind einige Hinweise von meinem .zshrc. Obwohl Sie sagen, dass Sie einzelne Ratschläge bevorzugen, ist dieser Beitrag eine langweilige Liste. Dennoch ist es eine gute Idee, die Punkte eins nach dem anderen durchzugehen. Fügen Sie einfach die interessanten Bits zu Ihrem hinzu ~/.zshrc und neu laden mit source ~/.zshrc. Ein letzter Tipp: lernen Sie die Tastenanschläge von zshStandard-Tastaturkürzel ("Emacs"): ^A ^E ^W Alt-F Alt-B Alt-P ^L ^R. Sie können ersetzen Alt durch zwei separate Tastenanschläge: Alt-P ist äquivalent zu ESC  P.


Dies gibt Ihnen eine umfangreichere Tab-Vervollständigung.

autoload -U compinit
compinit

Tab-Vervollständigung von beiden Enden.

setopt completeinword

Bei der Tabulatorvervollständigung sollte die Groß- / Kleinschreibung nicht beachtet werden.

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

Bessere Fertigstellung für killall.

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

Ändert die Definition von "Wort", z.B. 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; 10.000 Einträge speichern Dies macht dies zu einer nützlichen Gedächtnisstütze, um die Befehle zu finden, die Sie beim letzten Mal benutzt haben ./configure usw. Verwenden Sie Alt-P (Befehl finden, der wie folgt beginnt) und ^ R (in Geschichte suchen) frei.

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

Aktiviert alle Arten von erweitertem Globbing, wie ls ** / *. Txt (alle Textdateien finden), ls -d *(D) (Zeigen Sie alle Dateien an, einschließlich derjenigen, die mit "." beginnen). Um mehr zu erfahren, gehen Sie zu man zshexpn, Abschnitt "FILENAME GENERATION".

# superglobs
setopt extendedglob
unsetopt caseglob

Dies ist nützlich, um Befehle in Ihrem Verlauf zu speichern, 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 CPU-Nutzungsstatistiken 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 auf - nützlich bei der Entscheidung, welche Pakete Ihren Speicherplatz belegen.

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

93
2017-08-08 17:50



+1, um nützlich zu sein. -1 für heimliche Emacs Advocacy! - Triptych
Das könnte dir auch gefallengithub.com/robbyrussell/oh-my-zsh](oh-my-zsh) Das fügt zsh viele Plugins hinzu. - RedPixel


Ich würde das Buch empfehlen Von Bash bis Z Shell. Es enthält alle Hinweise, die Sie zum Wechseln Ihrer Shell benötigen. Es erklärt die Unterschiede der beiden Schalen und macht es leicht für einen neuen Zsher.


14
2017-08-07 20:36



Das Buch eignet sich sowohl für bash als auch für zsh. Du musst lieben, wie jedes Kapitel mit "Bash und Zsh kann all dies" beginnen und führt dann zu weiteren 30 Seiten von "und hier ist das Zsh nur Zeug" - Rick


Hier ist mein .zshrc und das ist die wichtigste Sache! Zsh haben viele Optionen, die Sie verwenden können, schauen Sie sich also einige der Beispiele im Netz an oder lesen Sie die Dokumentation im Zsh Startseite.

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

Übrigens, denken Sie daran, tab-compleation wo einige Beispiele hier zu versuchen:

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 passwordless ssh-keys oder ssh-agent verwenden, können Sie es nützlich finden, entfernte Dateien tabcomplete:

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 sei gewarnt, diese Shell wird dich faul machen und dir das Gefühl geben, dass eine Standard-Shell dumm und nervig ist!


8
2017-08-07 15:42





Ein paar besonders nützliche verlängerte Globs:

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

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

3- chmod g+w **/*(U^I) - Machen Sie alle Dateien, die mir gehören und nicht in der Gruppe schreibbar sind, für Gruppen schreibbar

Ja, natürlich können Sie dies mit schreiben find aber das ist leichter wegzuspringen. Es hat zwei Nachteile, um fair zu sein, beide damit zu tun, dass sie alle auf die Befehlszeile ausgedehnt werden: Wenn es mit vielen tausend Dateien übereinstimmt, wird die Befehlszeile zu lang und dies wird fehlschlagen, und zweitens werden alle Dateien gefunden bevor die Datei gestartet wird.

(Du brauchst setopt extendedglob wenn das nicht schon läuft)


5
2017-10-15 01:21





Ich weiß nicht so viel über Bash, also kann ich nicht rechnen. Einige Snippets 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

Einige Hotkeys, fügen Sie am Anfang der Zeile etwas 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 speicher ich dann in ~ / .zsh / Funktionen

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

4
2017-09-02 19:54





Ich bin in der gleichen Reise :)

Bisher habe ich festgestellt, dass es eine gute Konfigurationsdatei (.shrc) ist.

Nehmen Sie diesen als Beispiel http://matt.blissett.me.uk/linux/zsh/zshrcSchau dir die Kommentare an und hack dich herum. Stackoverflow und severphault und gute Suchmöglichkeiten.

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


3
2017-08-07 14:41





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

Erlernen Sie ein wenig über zstyle und wie verschiedene Sachen (besonders Vervollständigung) Sie ihre Konfiguration tun können, die zstyle verwendet.

Schauen Sie sich die assoziativen Arrays an. Auch die Standard-Arrays (Achtung die Unterschiede zur Bash, zum Besseren!)

Wenn Sie reguläre Ausdrücke verwenden, schauen Sie in =~ (welche bash auch hat) und bedenke: setopt rematch_pcre

Vermeide es, Skripte zu schreiben, die von mehr als nur ein wenig von zshs Magie abhängen, denn obwohl es fantastisch ist, kann zsh dazu tendieren, schreibgeschützt zu sein. Wenn Sie zu viel mehr verwenden, überlegen Sie, wann Sie zu einer Sprache wie Python wechseln sollten.

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


3
2017-09-02 19:21





Großer Vorteil - hervorragende Tab-Vervollständigung mit vordefinierten Fertigstellungsskripten für viele Befehle. Hier ist ein Beispiel, das die Ausgabe von zeigt apt-get<TAB>:

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

2
2017-11-14 08:39