Non chiedi cosa puoi fare per il tuo file dot della shell, ma cosa può fare per te un file dot della shell!
Sono stato su tutta la mappa del sistema operativo, ma negli ultimi anni i miei driver quotidiani sono stati i Mac. Per molto tempo ho usato Bash, ma quando alcuni amici hanno iniziato a fare proselitismo su zsh, ci ho provato. Non mi ci è voluto molto per apprezzarlo e, diversi anni dopo, lo preferisco fortemente per molte delle piccole cose che fa.
Sto usando zsh (fornito tramite Homebrew, non il sistema installato) e il miglioramento Oh My Zsh.
Gli esempi in questo articolo sono per il mio .zshrc
personale . La maggior parte funzionerà direttamente in Bash e non credo che nessuno si basi su Oh My Zsh, ma il tuo chilometraggio può variare. C'è stato un periodo in cui stavo mantenendo un file dotfile della shell sia per zsh che per Bash, ma alla fine ho rinunciato al mio .bashrc
.
Siamo tutti matti qui
Se desideri avere la possibilità di utilizzare lo stesso dotfile su tutti i sistemi operativi, ti consigliamo di dare un po' di intelligenza al tuo dotfile.
### Mac Specifics
if [[ "$OSTYPE" == "darwin"* ]]; then
# Mac-specific stuff here.
fi
Ad esempio, mi aspetto che i tasti Alt + freccia spostino il cursore in base alla parola anziché di un singolo spazio. Per fare in modo che ciò accada in iTerm2 (la mia shell preferita), aggiungo questo frammento alla parte specifica per Mac del mio .zshrc:
### Mac Specifics
if [[ "$OSTYPE" == "darwin"* ]]; then
### Mac cursor commands for iTerm2; map ctrl+arrows or alt+arrows to fast-move
bindkey -e
bindkey '^[[1;9C' forward-word
bindkey '^[[1;9D' backward-word
bindkey '\e\e[D' backward-word
bindkey '\e\e[C' forward-word
fi
E Bob?
Anche se ho imparato ad amare il mio file dot di shell, non volevo sempre le stesse cose disponibili sulle mie macchine domestiche come sulle mie macchine di lavoro. Un modo per risolvere questo problema è disporre di dotfile supplementari da utilizzare a casa ma non al lavoro. Ecco come ci sono riuscito:
if [[ `egrep 'dnssuffix1|dnssuffix2' /etc/resolv.conf` ]]; then
if [ -e $HOME/.work ]
source $HOME/.work
else
echo "This looks like a work machine, but I can't find the ~/.work file"
fi
fi
In questo caso, spengo il suffisso dns del mio lavoro (o più suffissi, a seconda della situazione) e ottengo un file separato che rende la mia vita lavorativa un po' migliore.
Quella cosa che fai
Ora è probabilmente un buon momento per smettere di usare la tilde (~
) per rappresentare la tua home directory durante la scrittura di script. Scoprirai che ci sono alcuni contesti in cui non viene riconosciuto. Prendere l'abitudine di usare la variabile d'ambiente $HOME
ti farà risparmiare un sacco di tempo per la risoluzione dei problemi e mal di testa in seguito.
L'estensione logica sarebbe quella di includere file di punti specifici del sistema operativo da includere se sei così incline.
Memoria, tutto solo al chiaro di luna
Il terminale Linux
- I 7 migliori emulatori di terminale per Linux
- 10 strumenti da riga di comando per l'analisi dei dati in Linux
- Scarica ora:cheat sheet SSH
- Cheat sheet sui comandi avanzati di Linux
- Esercitazioni sulla riga di comando di Linux
Ho scritto quantità imbarazzanti di shell e sono giunto alla conclusione che non voglio davvero scrivere di più. Non è che la shell non possa fare ciò di cui ho bisogno la maggior parte del tempo, ma trovo che se scrivo shell, probabilmente sto mettendo insieme una soluzione di nastro adesivo piuttosto che risolvere permanentemente il problema.
Allo stesso modo, odio memorizzare le cose e nel corso della mia carriera ho dovuto cambiare radicalmente il contesto nel corso di una giornata. La conseguenza pratica è che ho dovuto re-imparare molte cose più volte nel corso degli anni. ("Aspetta... quale struttura for-loop usa questa lingua?")
Quindi, ogni tanto decido che sono stanco di cercare di nuovo come fare qualcosa. Un modo per migliorare la mia vita è aggiungere alias.
Uno scenario comune per chiunque lavori con i sistemi è scoprire cosa sta occupando tutto il disco. Sfortunatamente, non sono mai stato in grado di ricordare questo incantesimo, quindi ho creato un alias di shell, chiamato in modo creativo bigdirs
:
alias bigdirs='du --max-depth=1 2> /dev/null | sort -n -r | head -n20'
Anche se potrei essere meno pigro e impararlo a memoria, beh, non è proprio il modo di Unix...
Errori di battitura e le persone che li amano
Un altro modo in cui l'uso di alias di shell migliora la mia vita è salvarmi dagli errori di battitura. Non so perché, ma ho sviluppato questa brutta abitudine di digitare un w
dopo la sequenza ea
, quindi se voglio cancellare il mio terminale, digito spesso cleawr
. Sfortunatamente, questo non significa nulla per il mio guscio. Finché non aggiungo questo piccolo pezzo d'oro:
alias cleawr='clear'
In un'istanza di Windows con un comando equivalente, ma migliore, mi ritrovo a digitare cls
. È frustrante vedere il tuo guscio alzare le mani, quindi aggiungo:
alias cls='clear'
Sì, sono a conoscenza di ctrl + l
, ma non lo uso mai.
Divertiti
Il lavoro può essere stressante. A volte hai solo bisogno di divertirti un po'. Se la tua shell non conosce il comando, chiaramente dovrebbe farlo e basta , forse vuoi alzare le spalle proprio per questo! Puoi farlo con una funzione:
shrug() { echo "¯\_(ツ)_/¯"; }
Se non funziona, forse devi capovolgere un tavolo:
fliptable() { echo "(╯°□°)╯ ┻━┻"; } # Flip a table. Example usage: fsck -y /dev/sdb1 || fliptable
Immagina il mio dispiacere e la mia frustrazione quando avevo bisogno di capovolgere una scrivania e non riuscivo a ricordare come l'avevo chiamata. Quindi ho aggiunto altri alias di shell:
alias flipdesk='fliptable'
alias deskflip='fliptable'
alias tableflip='fliptable'
E a volte devi festeggiare:
disco() {
echo "(•_•)"
echo "<) )╯"
echo " / \ "
echo ""
echo "\(•_•)"
echo " ( (>"
echo " / \ "
echo ""
echo " (•_•)"
echo "<) )>"
echo " / \ "
}
In genere, invierò l'output di questi comandi a pbcopy
e incollalo nello strumento di chat pertinente che sto utilizzando.
Ho ottenuto questa funzione divertente da un account Twitter che seguo chiamato "Command Line Magic:" @climagic. Dato che ora vivo in Florida, sono molto felice che questa sia l'unica neve nella mia vita:
snow() {
clear;while :;do echo $LINES $COLUMNS $(($RANDOM%$COLUMNS));sleep 0.1;done|gawk '{a[$3]=0;for(x in a) {o=a[x];a[x]=a[x]+1;printf "\033[%s;%sH ",o,x;printf "\033[%s;%sH*\033[0;0H",a[x],x;}}'
}
Divertimento con le funzioni
Abbiamo visto alcuni esempi di funzioni che utilizzo. Poiché pochi di questi esempi richiedono un argomento, potrebbero essere utilizzati come alias. Uso le funzioni in base alle preferenze personali quando si tratta di più di una singola affermazione breve.
In vari momenti della mia carriera, ho eseguito Graphite, una soluzione di metriche di serie temporali open source, scalabile. Ci sono stati abbastanza casi in cui ho dovuto trasporre un percorso metrico (delineato con punti) in un percorso del filesystem (delineato con barre), o viceversa, che è diventato utile avere funzioni dedicate per queste attività:
# Useful for converting between Graphite metrics and file paths
function dottoslash() {
echo $1 | sed 's/\./\//g'
}
function slashtodot() {
echo $1 | sed 's/\//\./g'
}
In un altro periodo della mia carriera, gestivo molto Kubernetes. Se non hai familiarità con l'esecuzione di Kubernetes, devi scrivere molto YAML. Sfortunatamente, non è difficile scrivere YAML non valido. Peggio ancora, Kubernetes non convalida YAML prima di provare ad applicarlo, quindi non scoprirai che non è valido finché non lo applichi. A meno che tu non lo convalidi prima:
function yamllint() {
for i in $(find . -name '*.yml' -o -name '*.yaml'); do echo $i; ruby -e "require 'yaml';YAML.load_file(\"$i\")"; done
}
Poiché ero stanco di mettermi in imbarazzo e occasionalmente di rompere la configurazione di un cliente, ho scritto questo piccolo frammento e l'ho aggiunto come hook pre-commit a tutti i miei repository rilevanti. Qualcosa di simile sarebbe molto utile come parte del tuo processo di integrazione continua, soprattutto se lavori come parte di un team.
Oh, dita, dove sei?
Una volta ero un eccellente dattilografo. Quei giorni sono lontani. Scrivo più di quanto avrei creduto possibile.
In momenti diversi, ho usato una discreta quantità di Chef o Kubernetes. Fortunatamente per me, non li ho mai usati contemporaneamente.
Parte dell'ecosistema Chef è Test Kitchen, una suite di strumenti che facilitano i test, che viene invocata con i comandi kitchen test
. Kubernetes è gestito con uno strumento CLI kubectl
. Entrambi i comandi richiedono diversi sottocomandi e nessuno dei due scorre via dalle dita in modo particolarmente fluido.
Invece di creare un mucchio di "alias di battitura", ho alias quei comandi in k
:
alias k='kitchen test $@'
o
alias k='kubectl $@'
Timesplitter
L'ultima metà della mia carriera ha comportato la scrittura di più codice con altre persone. Ho lavorato in molti ambienti in cui abbiamo eseguito il fork di copie dei repository sul nostro account e utilizziamo le richieste pull come parte del processo di revisione. Quando voglio assicurarmi che il mio fork di un determinato repository sia aggiornato con il genitore, uso fetchupstream
:
alias fetchupstream='git fetch upstream && git checkout master && git merge upstream/master && git push'
I miei occhi hanno visto la gloria dell'arrivo del colore
Mi piace il colore. Può semplificare l'uso di cose come le differenze.
alias diff='colordiff'
Ho pensato che le pagine man colorate fossero un trucco accurato, quindi ho incorporato questa funzione:
# Colorized man pages, from:
# http://boredzo.org/blog/archives/2016-08-15/colorized-man-pages-understood-and-customized
man() {
env \
LESS_TERMCAP_md=$(printf "\e[1;36m") \
LESS_TERMCAP_me=$(printf "\e[0m") \
LESS_TERMCAP_se=$(printf "\e[0m") \
LESS_TERMCAP_so=$(printf "\e[1;44;33m") \
LESS_TERMCAP_ue=$(printf "\e[0m") \
LESS_TERMCAP_us=$(printf "\e[1;32m") \
man "$@"
}
Adoro il comando which
. Ti dice semplicemente da dove proviene il comando che stai eseguendo nel filesystem, a meno che non sia una funzione di shell. Dopo più file di punti in cascata, a volte non è chiaro dove sia definita una funzione o cosa faccia. Si scopre che il whence
e type
i comandi possono aiutare in questo.
# Where is a function defined?
whichfunc() {
whence -v $1
type -a $1
}
Conclusione
Spero che questo articolo ti aiuti e ti ispiri a trovare modi per migliorare la tua esperienza quotidiana di utilizzo della shell. Non hanno bisogno di essere enormi, nuovi o complessi. Potrebbero risolvere un piccolo ma frequente attrito, creare una scorciatoia o persino offrire una soluzione per ridurre gli errori di battitura comuni.
Puoi dare un'occhiata al mio repository dotfiles, ma ti avverto che potrebbe essere necessario ripulire molto. Sentiti libero di usare tutto ciò che ritieni utile e per favore siate eccellenti gli uni con gli altri.