Ne demandez pas ce que vous pouvez faire pour votre dotfile shell, mais ce qu'un dotfile shell peut faire pour vous !
J'ai parcouru toute la carte du système d'exploitation, mais au cours des dernières années, mes pilotes quotidiens ont été des Mac. Pendant longtemps, j'ai utilisé Bash, mais quand quelques amis ont commencé à faire du prosélytisme avec zsh, j'ai tenté le coup. Il ne m'a pas fallu longtemps pour l'apprécier, et plusieurs années plus tard, je le préfère nettement pour beaucoup de petites choses qu'il fait.
J'utilise zsh (fourni via Homebrew, pas le système installé) et l'amélioration Oh My Zsh.
Les exemples de cet article sont pour mon .zshrc
personnel . La plupart fonctionneront directement dans Bash, et je ne pense pas qu'aucun compte sur Oh My Zsh, mais votre kilométrage peut varier. Il y a eu une période où je maintenais un dotfile shell pour zsh et Bash, mais j'ai finalement abandonné mon .bashrc
.
Nous sommes tous fous ici
Si vous voulez avoir la possibilité d'utiliser le même fichier de points sur tous les systèmes d'exploitation, vous voudrez donner un peu d'intelligence à votre fichier de points.
### Mac Specifics
if [[ "$OSTYPE" == "darwin"* ]]; then
# Mac-specific stuff here.
fi
Par exemple, je m'attends à ce que les touches fléchées Alt + déplacent le curseur par le mot plutôt que par un seul espace. Pour que cela se produise dans iTerm2 (mon shell préféré), j'ajoute cet extrait à la partie spécifique à Mac de mon .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
Et Bob ?
Alors que j'ai appris à aimer mon shell dotfile, je ne voulais pas toujours les mêmes choses disponibles sur mes machines personnelles que sur mes machines de travail. Une façon de résoudre ce problème est d'avoir des fichiers de points supplémentaires à utiliser à la maison mais pas au travail. Voici comment j'ai accompli ceci :
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
Dans ce cas, je supprime le suffixe DNS de mon travail (ou plusieurs suffixes, selon votre situation) et source un fichier séparé qui améliore un peu ma vie au travail.
Ce que vous faites
C'est probablement le bon moment pour arrêter d'utiliser le tilde (~
) pour représenter votre répertoire personnel lors de l'écriture de scripts. Vous constaterez qu'il existe certains contextes où il n'est pas reconnu. Prendre l'habitude d'utiliser la variable d'environnement $HOME
vous fera économiser beaucoup de temps de dépannage et de maux de tête plus tard.
L'extension logique serait d'inclure des fichiers de points spécifiques au système d'exploitation si vous le souhaitez.
Souvenir, tout seul au clair de lune
Le Terminal Linux
- Les 7 meilleurs émulateurs de terminaux pour Linux
- 10 outils de ligne de commande pour l'analyse de données sous Linux
- Télécharger maintenant :Aide-mémoire SSH
- Aide-mémoire des commandes Linux avancées
- Tutoriels de ligne de commande Linux
J'ai écrit des quantités embarrassantes de shell, et j'en suis venu à la conclusion que je n'ai vraiment pas envie d'en écrire plus. Ce n'est pas que shell ne puisse pas faire ce dont j'ai besoin la plupart du temps, mais je trouve que si j'écris shell, je mets probablement en place une solution de ruban adhésif plutôt que de résoudre définitivement le problème.
De même, je déteste mémoriser des choses et tout au long de ma carrière, j'ai dû faire des changements de contexte radicaux au cours d'une journée. La conséquence pratique est que j'ai dû réapprendre beaucoup de choses plusieurs fois au fil des ans. ("Attendez... quelle structure de boucle for ce langage utilise-t-il ?")
Donc, de temps en temps, je décide que j'en ai assez de chercher comment faire quelque chose à nouveau. Une façon d'améliorer ma vie est d'ajouter des alias.
Un scénario courant pour quiconque travaille avec des systèmes consiste à découvrir ce qui occupe tout le disque. Malheureusement, je n'ai jamais pu me souvenir de cette incantation, j'ai donc créé un alias de shell, appelé de manière créative bigdirs
:
alias bigdirs='du --max-depth=1 2> /dev/null | sort -n -r | head -n20'
Bien que je puisse être moins paresseux et le mémoriser, eh bien, ce n'est tout simplement pas la méthode Unix...
Les fautes de frappe et les gens qui les aiment
Une autre façon d'utiliser des alias de shell améliore ma vie en m'évitant les fautes de frappe. Je ne sais pas pourquoi, mais j'ai développé cette mauvaise habitude de taper un w
après la séquence ea
, donc si je veux effacer mon terminal, je tape souvent cleawr
. Malheureusement, cela ne veut rien dire pour ma coquille. Jusqu'à ce que j'ajoute ce petit morceau d'or :
alias cleawr='clear'
Dans une instance de Windows ayant une commande équivalente, mais meilleure, je me retrouve à taper cls
. C'est frustrant de voir votre coquille baisser les bras, alors j'ajoute :
alias cls='clear'
Oui, je connais ctrl + l
, mais je ne l'utilise jamais.
Amusez-vous
Le travail peut être stressant. Parfois, vous avez juste besoin de vous amuser un peu. Si votre shell ne connaît pas la commande qu'il doit clairement faire , peut-être que vous voulez hausser les épaules en retour ! Vous pouvez le faire avec une fonction :
shrug() { echo "¯\_(ツ)_/¯"; }
Si cela ne fonctionne pas, vous devrez peut-être retourner une table :
fliptable() { echo "(╯°□°)╯ ┻━┻"; } # Flip a table. Example usage: fsck -y /dev/sdb1 || fliptable
Imaginez mon chagrin et ma frustration lorsque j'ai eu besoin de retourner un bureau et que je ne me souvenais plus comment je l'avais appelé. J'ai donc ajouté quelques alias shell supplémentaires :
alias flipdesk='fliptable'
alias deskflip='fliptable'
alias tableflip='fliptable'
Et parfois, vous avez besoin de célébrer :
disco() {
echo "(•_•)"
echo "<) )╯"
echo " / \ "
echo ""
echo "\(•_•)"
echo " ( (>"
echo " / \ "
echo ""
echo " (•_•)"
echo "<) )>"
echo " / \ "
}
En règle générale, je dirige la sortie de ces commandes vers pbcopy
et collez-le dans l'outil de chat approprié que j'utilise.
J'ai obtenu cette fonction amusante d'un compte Twitter que je suis appelé "Command Line Magic :" @climagic. Depuis que je vis en Floride maintenant, je suis très heureux que ce soit la seule neige de ma vie :
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;}}'
}
S'amuser avec les fonctions
Nous avons vu quelques exemples de fonctions que j'utilise. Étant donné que peu de ces exemples nécessitent un argument, ils pourraient être utilisés comme alias. J'utilise des fonctions par préférence personnelle lorsqu'il s'agit de plusieurs instructions courtes.
À divers moments de ma carrière, j'ai exécuté Graphite, une solution de mesure de séries chronologiques open source et évolutive. Il y a eu suffisamment de cas où j'ai eu besoin de transposer un chemin de métrique (délimité par des points) vers un chemin de système de fichiers (délimité par des barres obliques), ou vice versa, qu'il est devenu utile d'avoir des fonctions dédiées pour ces tâches :
# Useful for converting between Graphite metrics and file paths
function dottoslash() {
echo $1 | sed 's/\./\//g'
}
function slashtodot() {
echo $1 | sed 's/\//\./g'
}
À une autre époque de ma carrière, j'utilisais beaucoup de Kubernetes. Si vous n'êtes pas familier avec l'exécution de Kubernetes, vous devez écrire beaucoup de YAML. Malheureusement, il n'est pas difficile d'écrire du YAML invalide. Pire encore, Kubernetes ne valide pas YAML avant d'essayer de l'appliquer, vous ne découvrirez donc pas qu'il est invalide tant que vous ne l'appliquez pas. Sauf si vous le validez au préalable :
function yamllint() {
for i in $(find . -name '*.yml' -o -name '*.yaml'); do echo $i; ruby -e "require 'yaml';YAML.load_file(\"$i\")"; done
}
Parce que j'en avais assez de m'embarrasser et de casser occasionnellement la configuration d'un client, j'ai écrit ce petit extrait et l'ai ajouté comme crochet de pré-commit à tous mes repos pertinents. Quelque chose de similaire serait très utile dans le cadre de votre processus d'intégration continue, surtout si vous travaillez en équipe.
Oh, doigts, où es-tu ?
J'étais autrefois un excellent dactylographe. Ces jours sont révolus depuis longtemps. J'ai fait plus de fautes de frappe que je ne l'aurais cru possible.
À différents moments, j'ai utilisé une bonne quantité de Chef ou de Kubernetes. Heureusement pour moi, je n'ai jamais utilisé les deux en même temps.
Une partie de l'écosystème Chef est Test Kitchen, une suite d'outils qui facilitent les tests, qui est invoquée avec les commandes kitchen test
. Kubernetes est géré avec un outil CLI kubectl
. Les deux commandes nécessitent plusieurs sous-commandes, et aucune ne sort des doigts de manière particulièrement fluide.
Plutôt que de créer un tas "d'alias de faute de frappe", j'ai aliasé ces commandes à k
:
alias k='kitchen test $@'
ou
alias k='kubectl $@'
Timesplitters
La dernière moitié de ma carrière a consisté à écrire plus de code avec d'autres personnes. J'ai travaillé dans de nombreux environnements où nous avons créé des copies de dépôts sur notre compte et utilisé des demandes d'extraction dans le cadre du processus de révision. Lorsque je veux m'assurer que mon fork d'un dépôt donné est à jour avec le parent, j'utilise fetchupstream
:
alias fetchupstream='git fetch upstream && git checkout master && git merge upstream/master && git push'
Mes yeux ont vu la gloire de la venue de la couleur
J'aime la couleur. Cela peut rendre des choses comme les diffs plus faciles à utiliser.
alias diff='colordiff'
J'ai pensé que les pages de manuel colorisées étaient une bonne astuce, j'ai donc intégré cette fonction :
# 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 "$@"
}
J'adore la commande which
. Il vous indique simplement d'où provient la commande que vous exécutez dans le système de fichiers, à moins qu'il ne s'agisse d'une fonction shell. Après plusieurs fichiers de points en cascade, il n'est parfois pas clair où une fonction est définie ou ce qu'elle fait. Il s'avère que le whence
et type
les commandes peuvent aider avec ça.
# Where is a function defined?
whichfunc() {
whence -v $1
type -a $1
}
Conclusion
J'espère que cet article vous aidera et vous inspirera pour trouver des moyens d'améliorer votre expérience quotidienne d'utilisation du shell. Ils n'ont pas besoin d'être énormes, nouveaux ou complexes. Ils peuvent résoudre un problème mineur mais fréquent, créer un raccourci ou même proposer une solution pour réduire les fautes de frappe courantes.
Vous êtes invités à parcourir mon référentiel dotfiles, mais je vous préviens qu'il pourrait nécessiter beaucoup de nettoyage. N'hésitez pas à utiliser tout ce que vous trouvez utile et soyez excellents les uns envers les autres.