Question Passer de bash à zsh [fermé]


J'envisage de passer de bash à zsh car je rencontre souvent des articles faisant l'éloge de zsh. Je suis un utilisateur de ligne de commande expérimenté et je suppose que les bases sont à peu près la même chose, donc je suis à la recherche de conseils pour obtenir les avantages de se déplacer, et tout à gotchas être au courant.

S'il vous plaît, donnez juste un conseil par réponse. Je suis à la recherche de gros 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.


141
2017-08-07 12:40


origine


J'aimerais savoir s'il est possible d'intégrer la commande non trouvée d'Ubuntu à zsh. Je suis revenu à bash pour cette raison (et beaucoup d'autres ennuis). - Marius Gedminas
Sujets connexes sur d'autres sites Stack Exchange: Cela vaut la peine de passer à zsh pour un usage occasionnel?  Qu'y a-t-il dans votre .zshrc?  Quelles fonctionnalités zsh utilisez-vous?  Caractéristiques uniques de bash par rapport à zsh  Y a-t-il une raison d'utiliser bash sur zsh?  Quelles sont les fonctionnalités de zsh et manquantes de bash, ou vice versa? - Gilles
Deux autres liens intéressants: "FAQ ZSH" zsh.sourceforge.net/FAQ & "ZSH est ton ami" mikegrouchy.com/blog/zsh-is-your-friend.html - Shadok
@MariusGedminas: (d'ici) zsh prend cela en charge, mais vous devez l’activer manuellement. Ajoutez simplement source /etc/zsh_command_not_found à ton .zshrc. - naught101


Réponses:


Comme tu dis, zsh est similaire à bien des égards à bash. Il a des fonctionnalités que vous ne trouverez pas dans bash, et il peut être étendu de manière puissante. Ne pensez pas à bouger comme une sorte de révolution, mais plutôt comme une série d'étapes évolutives qui vous aident dans votre travail quotidien. Voici quelques conseils de mon .zshrc. Bien que vous disiez préférer des conseils uniques, cet article est une longue liste. C'est quand même une bonne idée de passer en revue les points un par un. Ajoutez simplement les bits intéressants à votre ~/.zshrc et recharger avec source ~/.zshrc. Un dernier conseil: apprenez les frappes de zshles raccourcis clavier par défaut ("Emacs"): ^A ^E ^W Alt-F Alt-B Alt-P ^L ^R. Vous pouvez remplacer Alt par deux frappes distinctes: Alt-P est équivalent à ESC  P.


Cela vous donne une complétion plus complète de l'onglet.

autoload -U compinit
compinit

Achèvement de l'onglet des deux extrémités.

setopt completeinword

La complétion par tabulation doit être insensible à 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 "mot", par ex. 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 obus ouverts; stocker 10 000 entrées. Cela en fait un aide-mémoire utile pour trouver les commandes que vous avez utilisées la dernière fois pour ./configure etc. Utilisez Alt-P (trouver la commande qui commence comme ça) et ^ R (rechercher dans l’histoire) de manière libérale.

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

Active toutes sortes de globulations étendues, telles que ls ** / *. Txt (recherche de tous les fichiers texte), ls -d *(D) (affiche tous les fichiers, y compris ceux commençant par "."). Pour en savoir plus, rendez-vous sur man zshexpn, section "GÉNÉRATION DE NOM DE FICHIER".

# superglobs
setopt extendedglob
unsetopt caseglob

Ceci est utile pour mémoriser les 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

Bonne invite.

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

Affichage des statistiques d'utilisation du processeur pour les commandes de plus de 10 secondes

REPORTTIME=10

Certaines commandes que vous utilisez abondamment 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 selon leur taille, ce qui est utile pour décider quels paquets occupent de l’espace disque.

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 pour être utile. -1 pour le plaidoyer emacs discret! - Triptych
Vous pourriez aussi aimer [github.com/robbyrussell/oh-my-zsh](oh-my-zsh) ce qui ajoute beaucoup de plugins à zsh. - RedPixel


Je recommanderais le livre De bash à Z Shell. Il a tous les conseils dont vous avez besoin pour changer de shell. Il explique les différences entre les deux coques et facilite la tâche pour un nouveau zsher.


14
2017-08-07 20:36



Le livre est idéal pour les utilisateurs de bash et de zsh. Vous devez aimer comment chaque chapitre commence par "les deux bash et zsh peuvent faire tout cela" et mène ensuite à 30 autres pages de "et voici les trucs de zsh seulement" - Rick


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 au Zsh page d'accueil.

Mon fichier .zshrc ne contient pas de choses vraiment cool, à part un horodatage à droite de la ligne de commande.

Btw, rappelez-vous d'essayer la tabulation à chaque fois 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 tabcompléter les fichiers distants:

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 tab pour parcourir les différentes possibilités.

Mais attention, ce shell vous rendra fainéant et vous fera sentir qu'un obus standard est stupide et agaçant!


8
2017-08-07 15:42





Un couple de globes étendus particulièrement utiles:

1- rmdir *(/^F) - supprimer tous les répertoires non vides sous le répertoire courant

2- grep traceback /srv/log/**/*(.m-2) - cherchez cette regex dans les fichiers modifiés au cours des deux derniers jours

3- chmod g+w **/*(U^I) - faire en sorte que tous les fichiers que je possède et que je ne puisse pas écrire en groupe soient accessibles en écriture par groupe

Oui, bien sûr, vous pouvez écrire ceci avec find mais c'est plus facile de se lancer. Il y a deux inconvénients, pour être juste, les deux étant liés à la ligne de commande: si elle correspond à plusieurs milliers de fichiers, la ligne de commande sera trop longue et cela échouera. avant que le fichier ne commence à s'exécuter.

(Tu auras besoin setopt extendedglob si ce n'est pas déjà fait)


5
2017-10-15 01:21





Je ne sais pas grand chose sur bash, donc je ne peux pas compiler. 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 dans 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 en début de ligne du texte.

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 stocke alors dans ~ / .zsh / fonctions

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





Je suis dans le même voyage :)

Jusqu'à présent, j'ai trouvé que le problème était d'avoir un bon fichier de configuration (.zshrc).

Prenons celui-ci comme exemple http://matt.blissett.me.uk/linux/zsh/zshrc, regardez les commentaires et piratez-vous. Stackoverflow et severphault et de 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 :)


3
2017-08-07 14:41





Découvrez les globes étendus et récursifs étendus dans zsh.

Apprenez-en un peu plus sur zstyle et comment diverses choses (en particulier l’achèvement) vous permettent de régler leur configuration à l’aide de zstyle.

Regardez dans les tableaux associatifs. Aussi les tableaux standard (méfiez-vous des différences avec bash, pour le mieux!)

Si vous utilisez des expressions régulières, examinez =~ (que bash a aussi) et considérez: setopt rematch_pcre

Évitez d'écrire des scripts qui dépendent de plus de la magie de zsh, car même si c'est génial à utiliser, zsh peut avoir tendance à être en écriture seule. Si vous utilisez trop, réfléchissez au moment de passer à un langage tel que Python.

Zsh est séduisant. C'est le côté obscur. Bienvenue.


3
2017-09-02 19:21