J'envisage de passer de bash à zsh car je rencontre souvent des articles faisant l'éloge de zsh. Je suis un utilisateur expérimenté de la ligne de commande et je suppose que les bases sont à peu près les mêmes. Je cherche donc des conseils pour profiter des avantages du déplacement, ainsi que des pièges à connaître.
S'il vous plaît, donnez un conseil par réponse. Je suis à la recherche de petits morceaux où je peux revenir et intégrer des informations supplémentaires dans mon utilisation de Shell à un rythme soutenu plutôt que d'essayer de tout apprendre en une seule fois.
Comme vous le dites, zsh
est semblable à bien des égards à bash
name__. Il comporte certaines fonctionnalités que vous ne trouverez pas dans bash
name__, et il peut être étendu de manière très efficace. Ne considérez pas le déménagement comme une sorte de révolution, mais plutôt comme une suite d'étapes évolutives qui vous aideront dans votre travail quotidien. Voici quelques astuces de mon .zshrc
. Bien que vous disiez préférer des conseils individuels, cet article est une longue liste. Néanmoins, il est judicieux de passer en revue les points un par un. Ajoutez simplement les bits intéressants à votre ~/.zshrc
et rechargez avec source ~/.zshrc
. Un dernier conseil: apprenez les frappes au clavier de zsh
name __'s default ("Emacs"), raccourcis clavier: ^A ^E ^W Alt-F Alt-B Alt-P ^L ^R
. Vous pouvez remplacer Alt
par deux séquences de touches distinctes: Alt-P
est équivalent à ESC
P
name__.
Cela vous donne une complétion plus complète de l'onglet.
autoload -U compinit
compinit
Terminer la tabulation des deux côtés.
setopt completeinword
La complétion par des tabulations devrait être sensible à la casse.
zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}'
Meilleur achèvement pour killall.
zstyle ':completion:*:killall:*' command 'ps -u $USER -o cmd'
Modifie la définition de "Word", par exemple avec ^ W.
autoload select-Word-style
select-Word-style Shell
Couleurs pour ls.
if [[ -x "`whence -p dircolors`" ]]; then
eval `dircolors`
alias ls='ls -F --color=auto'
else
alias ls='ls -F'
fi
Raccourcis pour ls.
alias ll='ls -l'
alias la='ls -a'
Une histoire pour tous les coquillages ouverts; stocker 10 000 entrées. Cela en fait un outil de mémoire utile pour trouver les commandes que vous avez utilisées la dernière fois pour ./configure
etc. Utilisez Alt-P (commande de recherche commençant ainsi) et ^ R (recherche dans l'historique) librement.
HISTFILE=~/.zhistory
HISTSIZE=SAVEHIST=10000
setopt sharehistory
setopt extendedhistory
Active toutes sortes de globbing étendus, tels que ls **/*. Txt (trouver tous les fichiers texte), ls -d *(D)
(afficher tous les fichiers, y compris ceux commençant par "."). Pour en savoir plus, allez à man zshexpn
, section "GENERATION DE NOM DE FICHIER".
# superglobs
setopt extendedglob
unsetopt caseglob
Ceci est utile pour se souvenir des commandes de votre historique sans les exécuter.
setopt interactivecomments # pound sign in interactive Prompt
Tapez ".." au lieu de "cd ..", "/ usr/include" au lieu de "cd/usr/include".
setopt auto_cd
Belle invite.
PS1='[%T] %n@%m:%~# '
Afficher les statistiques d'utilisation du processeur pour les commandes prenant plus de 10 secondes
REPORTTIME=10
Certaines commandes que vous utilisez beaucoup dans 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'
Répertorie les paquets triés par taille - utile pour choisir les paquets qui occupent votre espace disque.
function apt-list-packages {
dpkg-query -W --showformat='${Installed-Size} ${Package} ${Status}\n' | grep -v deinstall | sort -n | awk '{print $1" "$2}'
}
Je recommanderais le livre De bash à Z Shell . Il contient tous les conseils dont vous avez besoin pour changer de shell. Cela explique les différences entre les deux coques et facilite la tâche d'un nouveau zsher.
Voici mon . Zshrc et c'est la chose la plus importante! zsh a beaucoup d'options que vous pouvez utiliser, alors regardez quelques-uns des exemples sur le net ou lisez la documentation sur page d'accueil de Zsh .
Mon .zshrc ne contient pas d'éléments vraiment intéressants, à l'exception d'un horodatage dans la partie droite de la ligne de commande.
Au fait, souvenez-vous d'essayer chaque fois où vous en trouverez quelques exemples ici:
mplayer -a[tab]
montrera quelque chose comme ça:
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
Et si vous utilisez ssh-keys ou ssh-agent sans mot de passe, vous trouverez peut-être utile de tabuler des fichiers distants complets:
scp apollo:/home/user/[tab]
Desktop/ Documents/ Downloads/ Music/ Pictures/ Public/ Templates/ Videos/
Après avoir obtenu la liste, vous pouvez appuyer plusieurs fois sur la touche de tabulation pour parcourir les différentes possibilités.
Mais soyez prévenus, ce Shell vous rendra paresseux et vous fera sentir qu'un Shell standard est stupide et agaçant!
Quelques globs étendus particulièrement utiles:
1- rmdir *(/^F)
- supprime tous les répertoires non vides du répertoire en cours
2- grep traceback /srv/log/**/*(.m-2)
- cherche cette regex dans les fichiers modifiés au cours des deux derniers jours
3- chmod g+w **/*(U^I)
- fait en sorte que tous les fichiers que je possède et qui ne sont pas en écriture en groupe soient en écriture en groupe
Oui, bien sûr, vous pouvez écrire ceci avec find
, mais il est plus facile de le supprimer. Pour être juste, il présente deux inconvénients, tous les deux étant étendus sur la ligne de commande: s'il correspond à plusieurs milliers de fichiers, la ligne de commande sera trop longue et cela échouera, puis tous les fichiers sont trouvés. avant que le fichier ne commence à fonctionner.
(Vous aurez besoin de setopt extendedglob
si ce n'est pas déjà fait)
Je ne sais pas grand chose à propos de bash, donc je ne peux pas compater. Quelques extraits de mon fichier de configuration zsh.
Un peu de 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 à l'invite
if [[ -n $SSH_CONNECTION ]]; then
export PS1='%m:%3~$(git_info_for_Prompt)%# '
else
export PS1='%3~$(git_info_for_Prompt)%# '
fi
Quelques raccourcis clavier, insérez du texte au début de la ligne.
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
Les fonctions, je les stocke ensuite dans ~/.zsh/functions
Le 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
Quelques options de 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 [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.]"
}
Je suis dans le même voyage :)
Jusqu'ici, j'ai trouvé que le problème est d'avoir un bon fichier de configuration (.zshrc).
Prenez celui-ci comme exemple http://matt.blissett.me.uk/linux/zsh/zshrc , regardez les commentaires et piratez-vous. Stackoverflow et severphault et les bons endroits pour chercher aussi.
Je n'ai pas encore plongé dans http://dotfiles.org/.zshrc , mais je n'ai pas beaucoup de temps à perdre :)
En savoir plus sur les globs étendus et récursifs dans zsh.
En savoir un peu plus sur zstyle et sur la manière dont diverses choses (en particulier l'achèvement) vous permettent d'ajuster leur configuration à l'aide de zstyle.
Regardez dans les tableaux associatifs. Aussi les tableaux standards (attention aux différences avec bash, pour le mieux!)
Si vous utilisez des expressions régulières, examinez =~
(que bash a également) et considérez: setopt rematch_pcre
Évitez d’écrire des scripts qui dépendent de plus de la magie de zsh, car bien que ce soit fantastique à utiliser, zsh peut avoir tendance à être en écriture seule. Si vous en utilisez trop, pensez au moment de passer à un langage tel que Python.
Zsh est séduisant. C'est le côté obscur. Bienvenue.
Gros avantage - excellente complétion des onglets avec des scripts de fin prédéfinis pour de nombreuses commandes. Voici un exemple montrant la sortie de apt-get<TAB>
:
apt-get
action
autoclean build-dep clean dselect-upgrade install remove update
autoremove check dist-upgrade help purge source upgrade
J'ai donné une coupe de discours et converti plusieurs personnes en zsh. Je garde un repo github de mes notes (quels sont les avantages) avec à la fois un démarreur et une copie de ma propre configuration zsh dans github ici.
Une autre grande ressource est la page des amoureux de zsh (provient de grml zsh site ).