Domanda Passare da bash a zsh [chiuso]


Sto considerando di passare da bash a zsh perché spesso mi imbatto in post che elogiano zsh. Sono un utente esperto della linea di comando e presumo che le basi siano praticamente le stesse, quindi sono alla ricerca di consigli per ottenere i benefici dello spostamento e di eventuali trucchi da prendere in considerazione.

Per favore basta dare un po 'di consigli per risposta. Sto cercando pezzetti di dimensioni da morso in cui posso tornare indietro e integrare ulteriori bit di informazioni nel mio utilizzo della shell a un ritmo costante piuttosto che cercare di imparare tutto in una volta.


141
2017-08-07 12:40


origine


Mi piacerebbe sapere se è possibile integrare il comando di Ubuntu non trovato con zsh. Sono tornato a bash per questo (e molti altri fastidi). - Marius Gedminas
Thread correlati su altri siti Stack Exchange: Vale la pena passare a zsh per uso occasionale?  Cosa c'è nel tuo file .zshrc?  Quali caratteristiche zsh usi?  Caratteristiche uniche di bash rispetto a zsh  C'è qualche ragione per usare bash su zsh?  Quali funzioni sono presenti in zsh e mancano da bash o viceversa? - Gilles
Altri due link interessanti: "Domande frequenti su ZSH" zsh.sourceforge.net/FAQ & "ZSH è tuo amico" mikegrouchy.com/blog/zsh-is-your-friend.html - Shadok
@MariusGedminas: (da quizsh supporta questo, ma devi abilitarlo manualmente. Basta aggiungere source /etc/zsh_command_not_found alla tua .zshrc. - naught101


risposte:


Come dici, zsh è simile sotto molti aspetti a bash. Ha alcune funzionalità che non troverai bashe può essere esteso in modi potenti. Non pensare di muoverti come una sorta di rivoluzione, ma piuttosto come una serie di passi evolutivi che ti aiutano nel tuo lavoro quotidiano. Ecco alcuni suggerimenti dal mio .zshrc. Sebbene tu dica di preferire singoli consigli, questo post è un elenco piuttosto lungo. Comunque è una buona idea passare attraverso i punti uno per uno. Basta aggiungere i bit interessanti al tuo ~/.zshrc e ricaricare con source ~/.zshrc. Un consiglio finale: impara le battute di zshscorciatoie da tastiera predefinite ("Emacs"): ^A ^E ^W Alt-F Alt-B Alt-P ^L ^R. Puoi sostituire Alt con due sequenze di tasti separate: Alt-P è equivalente a ESC  P.


Questo ti dà un completamento tab più ampio.

autoload -U compinit
compinit

Completamento del tab da entrambe le estremità.

setopt completeinword

Il completamento del tab dovrebbe essere senza distinzione tra maiuscole e minuscole.

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

Migliore completamento per killall.

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

Cambia la definizione di "parola", ad es. con ^ W.

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

Colori per ls.

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

Scorciatoie per ls.

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

Una cronologia per tutte le shell aperte; memorizzare 10.000 voci. Questo lo rende un utile aiuto per la memoria per trovare i comandi usati l'ultima volta ./configure ecc. Usa Alt-P (trova il comando che inizia così) e ^ R (cerca nella storia) liberamente.

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

Abilita tutti i tipi di globbing esteso, come ls ** / *. Txt (trova tutti i file di testo), ls -d *(D) (mostra tutti i file inclusi quelli che iniziano con "."). Per saperne di più, vai a man zshexpn, sezione "GENERAZIONE DEL FILENAME".

# superglobs
setopt extendedglob
unsetopt caseglob

Questo è utile per ricordare i comandi nella cronologia senza eseguirli.

setopt interactivecomments # pound sign in interactive prompt

Digitare ".." invece di "cd ..", "/ usr / include" invece di "cd / usr / include".

setopt auto_cd

Bel prompt.

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

Mostra le statistiche di utilizzo della CPU per i comandi che richiedono più di 10 secondi

REPORTTIME=10

Alcuni comandi che usi ampiamente 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'

Elenca i pacchetti ordinati in base alla loro dimensione: utile per decidere quali pacchetti occupano spazio su disco.

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 per essere utile. -1 per la difesa surrettizia di emacs! - Triptych
Potrebbe piacerti anche [github.com/robbyrussell/oh-my-zsh](oh-my-zsh) che aggiunge molti plugin a zsh. - RedPixel


Consiglierei il libro Da bash a Z Shell. Ha tutti i consigli che ti servono per cambiare la shell. Spiega le differenze di entrambe le shell e rende facile per un nuovo zsher.


14
2017-08-07 20:36



Il libro è ottimo sia per gli utenti bash che per quelli zsh. Devi amare il modo in cui ogni capitolo inizia con "sia bash che zsh possono fare tutto questo" e quindi porta ad altre 30 pagine di "ed ecco le sole cose di Zsh" - Rick


Ecco il mio .zshrc e questa è la cosa più importante! zsh ha un sacco di opzioni che puoi usare, quindi guarda alcuni degli esempi in rete o leggi la documentazione al Homepage Zsh.

Il mio .zshrc non contiene cose davvero interessanti se non un timestamp nel lato destro della riga di comando.

A proposito, ricordati di provare la scheda di controllo ogni dove alcuni esempi qui:

mplayer -a[tab]

mostrerà qualcosa di simile a questo:

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

E se usi ssh-key o ssh-agent senza password potresti trovarlo utile per i file remoti a livello di tabulazione:

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

Dopo aver ottenuto l'elenco, puoi quindi premere il tasto più volte per scorrere tra le diverse possibilità.

Ma attenzione, questa shell ti renderà pigro e ti farà sentire che una shell standard è stupida e fastidiosa!


8
2017-08-07 15:42





Un paio di globi estesi particolarmente utili:

1- rmdir *(/^F) - Elimina tutte le directory non vuote nella directory corrente

2- grep traceback /srv/log/**/*(.m-2) - cerca questa espressione regolare nei file modificati negli ultimi due giorni

3- chmod g+w **/*(U^I) - rendere qualsiasi file di mia proprietà e non di gruppo scrivibile in gruppo

Sì, certo che puoi scrivere con questo find ma questo è più facile da eliminare. Ha due inconvenienti, per essere onesti, entrambi hanno a che fare con la loro espansione sulla riga di comando: se corrisponde a molte migliaia di file la linea di comando diventerà troppo lunga e questo fallirà, e in secondo luogo verranno trovati tutti i file prima che il file inizi a girare.

(Avrai bisogno setopt extendedglob se non è già attivo)


5
2017-10-15 01:21





Non so molto di bash, quindi non posso compilarlo. Alcuni frammenti del mio file di configurazione zsh.

Alcuni 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 nel prompt

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

Alcuni tasti di scelta rapida, inseriscono all'inizio del testo del testo.

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

Le funzioni, memorizzo quindi in ~ / .zsh / functions

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

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

4
2017-09-02 19:54





Sono nello stesso viaggio :)

Finora ho scoperto che il problema è avere un buon file di configurazione (.zshrc).

Prendi questo come esempio http://matt.blissett.me.uk/linux/zsh/zshrc, guarda i commenti e fatti strada. Stackoverflow e severphault e buoni posti da cercare anche.

Devo ancora tuffarmi http://dotfiles.org/.zshrc, ma non ho molto tempo per perdere :)


3
2017-08-07 14:41





Ulteriori informazioni sul globbing esteso e sui globi ricorsivi in ​​zsh.

Impara un po 'su zstyle e su come varie cose (specialmente il completamento) ti permettono di mettere a punto la loro configurazione usando zstyle.

Guarda negli array associativi. Anche gli array standard (attenzione alle differenze da bash, per il meglio!)

Se usi espressioni regolari, guarda =~ (che bash ha anche) e considera: setopt rematch_pcre

Evita di scrivere script che dipendono da più di un po 'di magia di zsh, perché mentre è fantastico da usare, zsh può tendere ad essere di sola scrittura. Se stai usando troppo, pensa a quando passare a un linguaggio come Python.

Zsh è seducente. È il lato oscuro. Benvenuto.


3
2017-09-02 19:21





Grande vantaggio: eccellente completamento delle schede con script di completamento preconfezionati per molti comandi. Ecco un esempio che mostra l'output di 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





Ho dato un coupé di colloqui e ho convertito diverse persone in zsh. Tengo un repo github delle mie note (quali sono i vantaggi) insieme a un antipasto e una copia della mia configurazione di zsh in github qui.

http://github.com/mitechie/zshrc


1
2017-09-03 01:56