Vraag Verhuizen van bash naar zsh [gesloten]


Ik overweeg om van bash naar zsh te gaan omdat ik vaak posts tegenkom die zsh prijzen. Ik ben een ervaren gebruiker van de opdrachtregel en ik ga er vanuit dat de basis ongeveer hetzelfde is, dus ik ben op zoek naar advies om de voordelen van verhuizen te benutten, en alle valstrikken om op te letten.

Geef alsjeblieft een beetje advies per antwoord. Ik ben op zoek naar hapklare stukjes waar ik terug kan komen en extra stukjes info kan integreren in mijn shell-gebruik in een gestaag tempo in plaats van te proberen alles in een keer te leren.


141
2017-08-07 12:40


oorsprong


Ik zou graag willen weten of het mogelijk is het commando van Ubuntu te integreren - niet gevonden met zsh. Ik schakelde daarom terug naar bash (en vele andere ergernissen). - Marius Gedminas
Gerelateerde threads op andere Stack Exchange-sites: De moeite waard om over te schakelen naar zsh voor casual gebruik?  Wat zit er in je .zshrc?  Welke zsh-functies gebruikt u?  Unieke kenmerken van bash in vergelijking met zsh  Is er een reden om bash via zsh te gebruiken?  Welke functies staan ​​in zsh en ontbreken van bash of omgekeerd? - Gilles
Nog twee interessante links: "Veelgestelde vragen over ZSH" zsh.sourceforge.net/FAQ & "ZSH is je vriend" mikegrouchy.com/blog/zsh-is-your-friend.html - Shadok
@MariusGedminas: (vanaf hier) zsh ondersteunt dit, maar je moet het handmatig inschakelen. Voeg gewoon toe source /etc/zsh_command_not_found aan jouw .zshrc. - naught101


antwoorden:


Zoals jij zegt, zsh is in veel opzichten vergelijkbaar bash. Het heeft een aantal functies die je niet zult vinden bashen het kan op krachtige manieren worden uitgebreid. Denk niet aan verplaatsen als een soort revolutie, maar eerder als een reeks van evolutionaire stappen die je helpen bij je dagelijkse werk. Hier zijn enkele hints van mijn .zshrc. Hoewel je zegt dat je liever afzonderlijke adviezen hebt, is dit bericht een lange lijst. Toch is het een goed idee om de punten één voor één te doorlopen. Voeg gewoon de interessante stukjes toe aan je ~/.zshrc en herlaad met source ~/.zshrc. Een laatste tip: leer de toetsaanslagen van zshstandaard ("Emacs") sneltoetsen: ^A ^E ^W Alt-F Alt-B Alt-P ^L ^R. Je kunt vervangen Alt door twee verschillende toetsaanslagen: Alt-P is gelijk aan ESC  P.


Dit geeft u uitgebreidere tabvulling.

autoload -U compinit
compinit

Tabvoltooiing van beide kanten.

setopt completeinword

Tabvoltooiing moet hoofdletterongevoelig zijn.

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

Betere afronding voor killall.

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

Verandert de definitie van "woord", b.v. met ^ W.

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

Kleuren voor ls.

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

Sneltoetsen voor ls.

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

Eén geschiedenis voor alle open shells; bewaar 10.000 vermeldingen. Dit maakt dit een handig hulpmiddel om de opdrachten te vinden die u de vorige keer hebt gebruikt ./configure enz. Gebruik Alt-P (zoekcommando dat op deze manier begint) en ^ R (zoek in de geschiedenis) ruim.

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

Maakt allerlei soorten globbing mogelijk, zoals ls ** / *. Txt (alle tekstbestanden zoeken), ls -d *(D) (toon alle bestanden inclusief die beginnen met "."). Ga voor meer informatie naar man zshexpn, sectie "FILENAME GENERATIE".

# superglobs
setopt extendedglob
unsetopt caseglob

Dit is handig om opdrachten in uw geschiedenis te onthouden zonder ze uit te voeren.

setopt interactivecomments # pound sign in interactive prompt

Typ ".." in plaats van "cd ..", "/ usr / include" in plaats van "cd / usr / include".

setopt auto_cd

Leuke prompt.

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

Toon CPU-gebruiksstatistieken voor opdrachten die meer dan 10 seconden duren

REPORTTIME=10

Sommige opdrachten die u veel gebruikt in 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'

Geeft een lijst van pakketten gesorteerd op hun grootte - handig bij het bepalen welke pakketten u schijfruimte in beslag nemen.

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 om nuttig te zijn. -1 voor heimelijke voorspraak van emacs! - Triptych
Je zou ook leuk kunnen vinden [github.com/robbyrussell/oh-my-zsh](oh-my-zsh) dat veel plug-ins toevoegt aan zsh. - RedPixel


Ik zou het boek aanbevelen Van bash tot Z Shell. Het heeft al het advies dat je nodig hebt om van shell te wisselen. Het verklaart de verschillen van beide shells en maakt het gemakkelijk voor een nieuwe zsher.


14
2017-08-07 20:36



Het boek is geweldig voor zowel bash als zsh-gebruikers. Je moet wel houden van hoe elk hoofdstuk begint met "zowel bash als zsh kan dit allemaal" en leidt vervolgens naar nog eens 30 pagina's met "en hier is alleen het zsh-materiaal" - Rick


Hier is mijn .zshrc en dat is het meest belangrijke ding! zsh heeft veel opties die je kunt gebruiken, dus bekijk enkele van de voorbeelden op het internet of lees de documentatie op de Zsh-startpagina.

Mijn .zshrc bevat geen echt coole dingen anders dan een tijdstempel aan de rechterkant van de opdrachtregel.

Trouwens, vergeet niet om tab-compleation te proberen, waar een paar voorbeelden hier:

mplayer -a[tab]

zal zoiets tonen:

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

En als u wachtwoordloze ssh-sleutels of ssh-agent gebruikt, vindt u deze mogelijk handig voor tabcomplete externe bestanden:

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

Na het ophalen van de lijst kunt u vervolgens meerdere keren op het tabblad drukken om door de verschillende mogelijkheden te bladeren.

Maar wees gewaarschuwd, deze schaal zal je lui maken en je het gevoel geven dat een standaard huls stom en vervelend is!


8
2017-08-07 15:42





Een paar specifiek bruikbare uitgebreide klodders:

1- rmdir *(/^F) - verwijder alle niet-lege mappen onder de huidige map

2- grep traceback /srv/log/**/*(.m-2) - zoek naar deze regex in bestanden die in de laatste twee dagen zijn gewijzigd

3- chmod g+w **/*(U^I) - maak bestanden die eigendom zijn van mij en die niet door een groep kunnen worden geschreven, schrijfbaar door een groep

Ja, natuurlijk kun je dit met schrijven find maar dit is gemakkelijker om weg te rennen. Het heeft twee nadelen, om eerlijk te zijn, beide te maken met dat ze allemaal worden uitgebreid naar de opdrachtregel: als het overeenkomt met vele duizenden bestanden zal de opdrachtregel te lang worden en dit zal mislukken, en ten tweede zijn alle bestanden gevonden voordat het bestand begint te lopen.

(Je hebt nodig setopt extendedglob als dat nog niet aan de hand is)


5
2017-10-15 01:21





Ik weet niet zoveel over bash, dus ik kan niet compateren. Sommige fragmenten uit mijn zsh configuratiebestand.

Sommige config

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

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

Sommige sneltoetsen, voeg aan het begin van de regel wat tekst toe.

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

De functies bewaar ik dan in ~ / .zsh / functions

De 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

Sommige github-opties

#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





Ik zit in dezelfde reis :)

Tot dusver heb ik gemerkt dat het een goed configuratiebestand is (.zshrc).

Neem deze als voorbeeld http://matt.blissett.me.uk/linux/zsh/zshrc, bekijk de reacties en hack je een weg. Stackoverflow en severphault en goede plaatsen om te zoeken.

Ik moet er nog in duiken http://dotfiles.org/.zshrc, maar ik heb niet zoveel tijd om te verliezen :)


3
2017-08-07 14:41





Meer informatie over de uitgebreide globbing en recursive klodders in zsh.

Leer een beetje over zstyle en hoe verschillende dingen (vooral de voltooiing) je hun configuratie laten afstemmen met behulp van zstyle.

Kijk naar de associatieve matrices. Ook de standaard arrays (let op de verschillen van bash, ten goede!)

Als u reguliere expressies gebruikt, kijk dan in =~ (die bash ook heeft) en overwegen: setopt rematch_pcre

Vermijd het schrijven van scripts die afhankelijk zijn van meer dan een beetje van de magie van zsh, omdat hoewel het fantastisch is om te gebruiken, zsh de neiging heeft om alleen-schrijven te zijn. Als je te veel meer gebruikt, bedenk dan wanneer je moet overschakelen naar een taal zoals Python.

Zsh is verleidelijk. Het is de donkere kant. Welkom.


3
2017-09-02 19:21





Groot voordeel: uitstekende tab-voltooiing met voorverpakte voltooiingsscripts voor veel opdrachten. Hier is een voorbeeld van de uitvoer van 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