La shell Z nota come zsh è una shell per sistemi operativi simili a Linux/Unix. Ha somiglianze con altre shell in sh
(Bourne shell), ad esempio bash
e ksh
, ma fornisce molte funzionalità avanzate e potenti opzioni di modifica della riga di comando, come il completamento avanzato delle schede.
Sarebbe impossibile coprire tutte le opzioni di zsh qui; ci sono letteralmente centinaia di pagine che ne documentano le numerose caratteristiche. In questo articolo, presenterò cinque suggerimenti per renderti più produttivo utilizzando la riga di comando con zsh.
1. Temi e plugin
Nel corso degli anni, la comunità open source ha sviluppato innumerevoli temi e plugin per zsh. Un tema è una configurazione di prompt predefinita, mentre un plug-in è un insieme di utili alias e funzioni che semplificano l'utilizzo di un comando o di un linguaggio di programmazione specifico.
Il modo più rapido per iniziare a utilizzare temi e plugin è utilizzare un framework di configurazione zsh. Ce ne sono molti disponibili, ma il più popolare è Oh My Zsh. Per impostazione predefinita, abilita alcune opzioni di configurazione zsh sensate e viene caricato con centinaia di temi e plugin.
Un tema ti rende più produttivo in quanto aggiunge informazioni utili al tuo prompt, come lo stato del tuo repository Git o Python virtualenv in uso. Avere queste informazioni a colpo d'occhio ti evita di digitare i comandi equivalenti per ottenerle, ed è un bell'aspetto. Ecco un esempio di Powerlevel9k, il mio tema preferito:
Oltre ai temi, Oh My Zsh raggruppa tonnellate di utili plugin per zsh. Ad esempio, l'abilitazione del plug-in Git ti dà accesso a una serie di utili alias, come:
$ alias | grep -i git | sort -R | head -10
g=git
ga='git add'
gapa='git add --patch'
gap='git apply'
gdt='git diff-tree --no-commit-id --name-only -r'
gau='git add --update'
gstp='git stash pop'
gbda='git branch --no-color --merged | command grep -vE "^(\*|\s*(master|develop|dev)\s*$)" | command xargs -n 1 git branch -d'
gcs='git commit -S'
glg='git log --stat'
Sono disponibili plug-in per molti linguaggi di programmazione, sistemi di packaging e altri strumenti comunemente utilizzati dalla riga di comando. Ecco un elenco di plugin che utilizzo nella mia workstation Fedora:
git golang fedora docker oc sudo vi-mode virtualenvwrapper
2. Alias intelligenti
Gli alias sono molto utili in zsh. La definizione di alias per i comandi più utilizzati ti consente di risparmiare molto sulla digitazione. Oh My Zsh configura per impostazione predefinita diversi utili alias, inclusi alias per navigare nelle directory e sostituzioni di comandi comuni con opzioni aggiuntive come:
ls='ls --color=tty'
grep='grep --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn}'
Oltre agli alias dei comandi, zsh abilita altri due utili tipi di alias:l'alias suffisso e l'alias globale .
Un alias suffisso consente di aprire il file digitato nella riga di comando utilizzando il programma specificato in base all'estensione del file. Ad esempio, per aprire i file YAML usando vim, definisci il seguente alias:
alias -s {yml,yaml}=vim
Ora se digiti un nome di file che termina con yml
o yaml
nella riga di comando, zsh apre quel file usando vim:
$ playbook.yml
# Opens file playbook.yml using vim
Un alias globale consente di creare un alias che viene espanso in qualsiasi punto della riga di comando, non solo all'inizio. Questo è molto utile per sostituire nomi di file comuni o comandi inviati tramite pipe. Ad esempio:
alias -g G='| grep -i'
Per utilizzare questo alias, digita G
ovunque tu debba digitare il comando pipe:
$ ls -l G do
drwxr-xr-x. 5 rgerardi rgerardi 4096 Aug 7 14:08 Documents
drwxr-xr-x. 6 rgerardi rgerardi 4096 Aug 24 14:51 Downloads
Quindi, vediamo come zsh aiuta a navigare nel filesystem.
3. Facile navigazione nella directory
Quando si utilizza la riga di comando, la navigazione tra directory diverse è una delle attività più comuni. Zsh rende tutto più semplice fornendo alcune utili funzioni di navigazione nelle directory. Queste funzionalità sono abilitate con Oh My Zsh, ma puoi abilitarle usando questo comando:
setopt autocd autopushd \ pushdignoredups
Con queste opzioni impostate, non è necessario digitare cd
per cambiare directory. Basta digitare il nome della directory e zsh passa ad esso:
$ pwd
/home/rgerardi
$ /tmp
$ pwd
/tmp
Per tornare indietro, digita -
:
Zsh conserva la cronologia delle directory che hai visitato in modo da poter passare rapidamente a qualsiasi di esse. Per vedere l'elenco, digita dirs -v
:
$ dirs -v
0 ~
1 /var/log
2 /var/opt
3 /usr/bin
4 /usr/local
5 /usr/lib
6 /tmp
7 ~/Projects/Opensource.com/zsh-5tips
8 ~/Projects
9 ~/Projects/ansible
10 ~/Documents
Passa a qualsiasi directory in questo elenco digitando ~#
dove # è il numero della directory nell'elenco. Ad esempio:
$ pwd
/home/rgerardi
$ ~4
$ pwd
/usr/local
Combina questi con gli alias per rendere ancora più semplice la navigazione:
d='dirs -v | head -10'
1='cd -'
2='cd -2'
3='cd -3'
4='cd -4'
5='cd -5'
6='cd -6'
7='cd -7'
8='cd -8'
9='cd -9'
Ora puoi digitare d
per vedere i primi dieci elementi dell'elenco e il numero per passare ad esso:
$ d
0 /usr/local
1 ~
2 /var/log
3 /var/opt
4 /usr/bin
5 /usr/lib
6 /tmp
7 ~/Projects/Opensource.com/zsh-5tips
8 ~/Projects
9 ~/Projects/ansible
$ pwd
/usr/local
$ 6
/tmp
$ pwd
/tmp
Infine, zsh espande automaticamente i nomi delle directory con il completamento della scheda. Digita le prime lettere dei nomi delle directory e TAB
per usarlo:
$ pwd
/home/rgerardi
$ p/o/z (TAB)
$ Projects/Opensource.com/zsh-5tips/
Questa è solo una delle funzionalità abilitate dal potente sistema di completamento delle schede di zsh. Diamo un'occhiata ad altri.
4. Completamento delle schede avanzate
Il potente sistema di completamento di Zsh è uno dei suoi tratti distintivi. Per semplificare, lo chiamo completamento delle schede, ma sotto il cofano sta accadendo più di una cosa. Di solito c'è l'espansione e il completamento dei comandi. Ne discuterò insieme qui. Per i dettagli, consulta questa Guida per l'utente.
Il completamento dei comandi è abilitato per impostazione predefinita con Oh My Zsh. Per abilitarlo, aggiungi le seguenti righe al tuo .zshrc
file:
autoload -U compinit
compinit
Il sistema di completamento di Zsh è intelligente. Cerca di suggerire solo elementi che possono essere utilizzati in determinati contesti, ad esempio, se si digita cd
e TAB
, zsh suggerisce solo nomi di directory poiché conosce cd
non funziona con nient'altro.
Al contrario, suggerisce nomi utente quando si eseguono comandi relativi all'utente o nomi host quando si utilizza ssh
o ping
, per esempio.
Ha una vasta libreria di completamento e comprende molti comandi diversi. Ad esempio, se stai usando tar
comando, puoi premere Tab per vedere un elenco di file disponibili nel pacchetto come candidati per l'estrazione:
$ tar -xzvf test1.tar.gz test1/file1 (TAB)
file1 file2
Ecco un esempio più avanzato, utilizzando git
. In questo esempio, quando si digita TAB
, zsh completa automaticamente il nome dell'unico file nel repository che può essere gestito:
$ ls
original plan.txt zsh-5tips.md zsh_theme_small.png
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: zsh-5tips.md
no changes added to commit (use "git add" and/or "git commit -a")
$ git add (TAB)
$ git add zsh-5tips.md
Comprende anche le opzioni della riga di comando e suggerisce solo quelle rilevanti per il sottocomando selezionato:
$ git commit - (TAB)
--all -a -- stage all modified and deleted paths
--allow-empty -- allow recording an empty commit
--allow-empty-message -- allow recording a commit with an empty message
--amend -- amend the tip of the current branch
--author -- override the author name used in the commit
--branch -- show branch information
--cleanup -- specify how the commit message should be cleaned up
--date -- override the author date used in the commit
--dry-run -- only show the list of paths that are to be committed or not, and any untracked
--edit -e -- edit the commit message before committing
--file -F -- read commit message from given file
--gpg-sign -S -- GPG-sign the commit
--include -i -- update the given files and commit the whole index
--interactive -- interactively update paths in the index file
--message -m -- use the given message as the commit message
... TRUNCATED ...
Dopo aver digitato TAB
, puoi utilizzare i tasti freccia per navigare nell'elenco delle opzioni e selezionare quella che ti serve. Ora non è necessario memorizzare tutte quelle opzioni Git.
Ci sono molte opzioni disponibili. Il modo migliore per trovare ciò che ti è più utile è utilizzarlo.
5. Modifica e cronologia della riga di comando
Anche le capacità di modifica della riga di comando di Zsh sono utili. Per impostazione predefinita, emula emacs. Se, come me, preferisci vi/vim, abilita i binding vi con il seguente comando:
$ bindkey -v
Se stai usando Oh My Zsh, la vi-mode
abilita collegamenti aggiuntivi e un indicatore di modalità sul tuo prompt, molto utile.
Dopo aver abilitato i collegamenti vi, puoi modificare la riga di comando usando i comandi vi. Ad esempio, premi ESC+/
per cercare nella cronologia della riga di comando. Durante la ricerca, premendo n
porta la successiva riga corrispondente e N
il precedente. I comandi vi più comuni funzionano dopo aver premuto ESC
come 0
per saltare all'inizio della riga, $
per saltare alla fine, i
per inserire, a
per aggiungere, ecc. Anche i comandi seguiti dal movimento, come cw
per cambiare una parola.
Oltre alla modifica della riga di comando, zsh fornisce diverse utili funzioni della cronologia della riga di comando se si desidera correggere o rieseguire i comandi utilizzati in precedenza. Ad esempio, se hai commesso un errore, digitando fc
porta l'ultimo comando nel tuo editor preferito per risolverlo. Rispetta il $EDITOR
variabile e per impostazione predefinita usa vi.
Un altro comando utile è r
, che riesegue l'ultimo comando; e r <WORD>
, che esegue l'ultimo comando che contiene la stringa WORD
.
Infine, digitando double bang (!!
) riporta l'ultimo comando in un punto qualsiasi della riga. Questo è utile, ad esempio, se hai dimenticato di digitare sudo
per eseguire comandi che richiedono privilegi elevati:
$ less /var/log/dnf.log
/var/log/dnf.log: Permission denied
$ sudo !!
$ sudo less /var/log/dnf.log
Queste funzionalità semplificano la ricerca e il riutilizzo dei comandi digitati in precedenza.
Dove andare da qui?
Queste sono solo alcune delle funzionalità di zsh che possono renderti più produttivo; ce ne sono molti di più. Per ulteriori informazioni, consulta le seguenti risorse:
Un'introduzione alla Z Shell
Una guida per l'utente a ZSH
Wiki di Archlinux
zsh-amanti
Hai qualche consiglio sulla produttività di zsh da condividere? Mi piacerebbe sentirne parlare nei commenti qui sotto.