Travail rapide et efficace en ligne de commande

Il existe de nombreux conseils et astuces en ligne de commande sur Internet. La plupart d'entre eux décrivent les triviaux comme "apprendre les raccourcis clavier" ou " sudo !! exécutera la commande précédente avec sudo". Au lieu de cela, je vais vous dire quoi faire quand vous avez déjà appris les raccourcis clavier et que vous connaissez sudo !! .


Le terminal devrait démarrer instantanément


Combien de temps vous passez à lancer un terminal? Et un autre? Pendant longtemps, j'ai utilisé le raccourci Ctrl + Alt + T pour lancer un terminal et je pensais que c'était rapide. Lorsque j'ai migré d'Openbox vers i3, j'ai commencé à lancer un terminal via Win + Enter, cette liaison fonctionnait dès le départ. Tu sais quoi? Maintenant, je ne pense pas que Ctrl + Alt + T soit assez rapide.


Bien sûr, la chose n'est pas une accélération en millisecondes, mais que vous ouvrez un terminal au niveau des réflexes, complètement inconscient de cela.


Donc, si vous utilisez souvent un terminal, mais prenez une souris pour le lancer, essayez de configurer un raccourci clavier pratique. Je suis sûr que vous l'aimerez.


Zsh au lieu de bash


C'est un sujet de guerre sacrée, je sais. Vous devez installer Zsh pour au moins trois fonctionnalités: saisie semi-automatique avancée, correction de faute de frappe et achèvement de plusieurs noms de chemin: lorsqu'un seul onglet convertit /u/s/d en /usr/share/doc . Arch Linux a déjà migré vers Zsh dans son CD d'installation. J'espère que Zsh deviendra une fois un shell par défaut dans Ubuntu. Ce sera un moment historique.


Commencer à utiliser Zsh n'est pas difficile du tout. Installez-le simplement via le gestionnaire de paquets et trouvez une jolie configuration. Je recommande de prendre la configuration utilisée dans Arch Linux:


 $ wget -O ~/.zshrc https://git.grml.org/f/grml-etc-core/etc/zsh/zshrc 

La seule chose qui reste est de changer votre shell par défaut et de vous reconnecter.


 $ chsh -s $(which zsh) 

C'est tout, continuez à travailler comme si de rien n'était.


A quoi devrait ressembler l'invite du shell


L'invite du shell est un petit texte affiché dans le terminal au début de votre ligne de commande. Il doit être configuré pour votre type de travail. Vous pouvez le percevoir comme le tableau de bord d'un véhicule. S'il vous plaît, mettez-y des informations utiles, laissez-les vous aider à naviguer! Rendez-le pratique surtout si vous le voyez tous les jours!


L'invite du shell doit être colorée. Vous n'êtes pas d'accord? Essayez de compter le nombre de commandes exécutées dans ce terminal:



Et maintenant avec de la couleur:



L'invite du shell doit afficher le répertoire de travail actuel d'un shell. Si le répertoire de travail actuel n'est pas affiché, vous devez le garder à l'esprit et le vérifier périodiquement avec la commande pwd . S'il vous plaît ne faites pas ça. Gardez à l'esprit certaines choses vraiment importantes et ne perdez pas votre temps pour la commande pwd .


Si vous passez parfois au compte root, vous avez besoin d'une indication "utilisateur actuel". Le nom d'utilisateur particulier n'est souvent pas important, mais son statut (normal ou root) l'est. La solution consiste à utiliser color: red shell prompt pour root et green pour un utilisateur régulier. Et vous ne prendrez jamais le contrôle du shell racine comme d'habitude.


Si vous vous connectez à des serveurs à l'aide de ssh, vous devez distinguer vos shells locaux et distants. Pour cela, votre invite shell doit contenir un nom d'hôte, ou mieux encore - indiquer une connexion ssh.


L'invite du shell peut afficher le code de sortie de la dernière commande. N'oubliez pas que le code de sortie zéro signifie qu'une commande s'est terminée avec succès, non nulle - la commande s'est terminée sans succès. Vous pouvez obtenir le code de sortie de la dernière commande via echo $? , mais taper tout ce qui est sacrément long. Laissez le shell vous montrer la sortie infructueuse à la place.


Si vous travaillez avec des dépôts Git, il sera utile de voir l'état du référentiel dans l'invite du shell: la branche actuelle et l'état du répertoire de travail. Vous gagnerez du temps sur les commandes git status et git branch et ne vous engagez pas sur une mauvaise branche. Oui, le calcul du statut peut prendre beaucoup de temps dans les dépôts de graisses, mais pour moi les avantages l'emportent sur les inconvénients.


Certaines personnes ajoutent une horloge à l'invite du shell ou même le nom d'un terminal virtuel (tty), ou des gribouillis arbitraires. Tout cela est superflu. Il vaut mieux garder beaucoup de place pour les commandes.


Voilà à quoi ressemble mon invite shell dans différentes conditions:



Vous pouvez voir sur la capture d'écran que la barre de titre du terminal fait le même travail. C'est aussi un morceau de tableau de bord et il devrait également être configuré.


Alors, comment tout cela devrait-il être implémenté dans .zshrc ? La variable PROMPT définit l'invite de gauche et RPROMPT définit l'invite de droite. La variable EUID définit le statut d'un utilisateur (normal ou root) et la présence SSH_CLIENT ou SSH2_CLIENT indique une connexion ssh. Nous pouvons donc avoir un modèle:


 if [[ -n "$SSH_CLIENT" || -n "$SSH2_CLIENT" ]]; then if [[ $EUID == 0 ]]; then PROMPT=... else PROMPT=... fi else # not SSH if [[ $EUID == 0 ]]; then PROMPT=... else PROMPT=... fi fi 

Je ne montre pas le code prêt pour le copier-coller car l'implémentation exacte est une question de goût. Si vous ne voulez pas déranger et que la capture d'écran ci-dessus vous convient, prenez mon cofig dans le Github .


Résumé:


  • L'invite du shell coloré est un must have.
  • Le minimum requis est un répertoire de travail actuel.
  • L'enveloppe de la racine doit être clairement visible.
  • Le nom d'un utilisateur ne se soucie pas d'une charge utile si vous utilisez un seul compte.
  • Le nom d'hôte est utile si vous vous connectez aux serveurs via ssh, il n'est pas obligatoire sinon.
  • Il est utile de voir le code de sortie infructueux d'une dernière commande.
  • Git repo status permet de gagner du temps sur git status et les commandes de git branch et apporte une infaillibilité.

Utiliser beaucoup l'historique des commandes


La plupart des commandes de votre vie que vous saisissez plus d'une fois, il serait donc cool de les retirer de l'historique au lieu de taper à nouveau. Tous les shells modernes enregistrent un historique des commandes et offrent plusieurs façons de rechercher dans cet historique.


Peut-être êtes-vous déjà en mesure de creuser l'historique à l'aide des raccourcis clavier Ctrl + R. Malheureusement, il présente deux inconvénients:


  1. La ligne de commande doit être vide pour commencer la recherche, c'est-à-dire dans le cas où "on a commencé à taper une commande - souvenu de la recherche", vous devez d'abord nettoyer votre saisie, puis appuyez sur Ctrl + R et répétez votre saisie. Cela prend trop de temps.
  2. La recherche directe ne fonctionne pas par défaut car Ctrl + S arrête le terminal.

Le type de recherche le plus rapide et le plus pratique fonctionne de cette façon:


  1. Vous commencez à taper une commande,
  2. vous vous souvenez de la recherche,
  3. vous appuyez sur un raccourci clavier et le shell vous propose des commandes de l'historique qui ont commencé de la même manière.

Par exemple, vous souhaitez synchroniser un répertoire local avec un répertoire distant à l'aide de Rsync et vous l'avez déjà fait deux heures plus tôt. Vous tapez rsync , appuyez sur une touche de raccourci une ou deux fois et la commande souhaitée est prête à être lancée. Vous n'avez pas besoin d'activer le mode de recherche d'abord, l'invite du shell ne change pas en (reverse-i-search)': , et rien ne saute nulle part. Vous faites simplement défiler l'historique de la même manière que vous appuyez sur les flèches ↑ ↓ pour faire défiler les commandes entrées précédemment, mais avec un filtrage supplémentaire. C'est vraiment cool et ça fait gagner beaucoup de temps.


Ce type de recherche ne fonctionne pas par défaut dans Bash et Zsh, vous devez donc l'activer manuellement. J'ai choisi PgUp pour rechercher en avant et PgDown pour rechercher en arrière. C'est loin de les atteindre, mais j'ai déjà pris l'habitude. Peut-être que plus tard je passerai à quelque chose de plus proche comme Ctrl + P et Ctrl + N.


Pour Bash, vous devez ajouter quelques chaînes à /etc/inputrc de ~/.inputrc :


 "\e[5~": history-search-backward "\e[6~": history-search-forward 

Si vous avez pris un .zshrc complet à l' .zshrc , il est très probable que PgUp et PgDown font déjà le travail. Sinon, ajoutez à ~/.zshrc :


 bindkey "^[[5~" history-beginning-search-backward # pg up bindkey "^[[6~" history-beginning-search-forward # pg down 

Les coquilles de poisson et d'Ipython ont déjà une telle recherche liée aux flèches ↑ ↓. Je pense que de nombreux utilisateurs ont migré vers Fish uniquement pour le comportement des flèches. Bien sûr, il est possible de lier les flèches de cette façon dans Bash et Zsh si vous le souhaitez. Utilisez-le dans /etc/inputrc de ~/.inputrc :


 "\e[A":history-search-backward "\e[B":history-search-forward 

Et ceci pour ~/.zshrc :


 autoload -U up-line-or-beginning-search autoload -U down-line-or-beginning-search zle -N up-line-or-beginning-search zle -N down-line-or-beginning-search bindkey "^[[A" up-line-or-beginning-search bindkey "^[[B" down-line-or-beginning-search 

Il est curieux qu'au fil du temps, j'ai commencé à écrire des commandes en gardant à l'esprit que plus tard je les retirerai de l'histoire. Permettez-moi de vous montrer quelques techniques.


Rejoignez les commandes qui se suivent toujours:


 # ip link set eth1 up && dhclient eth1 # mkdir /tmp/t && mount /dev/sdb1 /tmp/t 

Les chemins absolus au lieu de relatifs vous permettent d'exécuter une commande à partir de n'importe quel répertoire:
vim ~/.ssh/config au lieu de vim .ssh/config , systemd-nspawn /home/chroot/stretch au lieu de systemd-nspawn stretch et ainsi de suite.


L'utilisation de caractères génériques rend vos commandes plus universelles. Je l'utilise habituellement en conjonction avec chmod et chown .


 # chown root:root /var/www/*.sq && chmod 644 /var/www/*.sq 

Raccourcis clavier


Voici le minimum requis.


Alt +. - remplace le dernier argument de la commande précédente. Il est également accessible avec !$ .
Ctrl + A, Ctrl + E - saute respectivement au début et à la fin de la ligne.
Ctrl + U, Ctrl + Y - couper et coller. C'est pratique lorsque vous tapez une commande complexe et que vous remarquez que vous devez d'abord en exécuter une autre. Hmm, où enregistrer l'entrée actuelle? Ici.
Ctrl + W - tue un mot avant le curseur. Il efface la ligne lorsqu'il est maintenu enfoncé. Par défaut, l'entrée est enregistrée dans le presse-papiers (utilisée pour Ctrl + Y).
Ctrl + K - coupe la partie de la ligne après le curseur, l'ajoutant au presse-papiers. Ctrl + A Ctrl + K efface rapidement la ligne.
PgUp, PgDown, Ctrl + R - recherche d'historique.
Ctrl + L efface le terminal.


Réactivité du clavier


Je veux vous montrer une petite configuration qui vous permet de faire défiler, naviguer et effacer plus rapidement. Que faisons-nous lorsque nous voulons effacer quelque chose de grand? Nous appuyons sur la touche Retour arrière et la maintenons enfoncée, et nous la regardons revenir en arrière en effaçant les caractères. Que se passe-t-il exactement? Après avoir appuyé sur Backspace, un caractère disparaît, puis passe un petit délai, puis la répétition automatique est déclenchée: Backspace efface les caractères un par un, comme vous le frappez à plusieurs reprises.


Je vous recommande de régler le retard et la fréquence de répétition automatique en fonction de la vitesse de vos doigts. Le délai est requis lorsque vous souhaitez effacer un seul caractère - il vous donne le temps de relâcher une touche. Un retard trop important vous fait attendre une répétition automatique. Pas assez pour que vous soyez ennuyé, mais assez pour ralentir le transfert de vos pensées de la tête vers l'ordinateur. Plus la fréquence de répétition automatique est élevée, plus le texte est effacé rapidement et plus il est difficile d'arrêter ce processus. Le but est de trouver une valeur optimale.


Ainsi, la commande magique est:


 $ xset r rate 190 20 

190 - durée du retard en millisecondes,
20 - fréquence en répétitions par seconde.


Je recommande de partir de ces valeurs et d'augmenter petit à petit le retard jusqu'à faux positifs, puis de revenir un peu. Si le délai est trop petit, vous ne pourrez pas utiliser le clavier. Pour résoudre ce problème, un serveur X ou un ordinateur complet doit être redémarré. Alors, soyez prudent.


Pour enregistrer les paramètres, vous devez ajouter cette commande quelque part dans le démarrage automatique de X.


Indication de sortie de processus


Je dois souvent lancer des processus de longue haleine: une grosse sauvegarde, un transfert de données volumineuses, un empaquetage / extraction d'archives, la construction de paquets, etc. Habituellement, je démarre un tel processus, passe à une autre tâche et regarde occasionnellement si mon processus à long terme s'est terminé. Parfois, je plonge trop profondément dans le travail et l'oublie. La solution consiste à ajouter une notification de sortie de processus qui me mettra hors de transe.


Il existe de nombreux outils à cet effet: notify-send, dzen2, bip, aplay, wall. Tous sont bons d'une manière ou d'une autre, mais ne fonctionnent pas avec la connexion ssh. C'est pourquoi j'utilise le bip du terminal:


 $ long-running-command; echo $'\a' 

Le codage ASCII a un caractère 0x7, nommé bell . Il est utilisé pour émettre un bip sur le haut-parleur du PC. Le haut-parleur PC n'est pas une chose moderne, tous les ordinateurs ne l'ont pas et il n'est pas entendu dans les écouteurs. C'est pourquoi certains terminaux utilisent une soi-disant cloche visuelle. J'utilise urxvt, et il effectue une cloche visuelle en levant le drapeau d'urgence. Qu'est ce que c'est? C'est une chose utilisée quand une fenêtre veut vous dire que c'est urgent.


Vous pouvez vérifier comment votre terminal réagit au caractère de la cloche en ce moment:


 $ sleep 3; echo $'\a' 

Trois secondes vous sont accordées pour passer à une autre fenêtre, cela peut être nécessaire.


Malheureusement, tous les terminaux ne peuvent pas afficher la cloche visuelle en levant le drapeau d'urgence. J'ai vérifié les plus populaires.


Émulateur de terminalcloche visuelle comme drapeau d'urgence
konsolepeut être activé dans les préférences
urxvtoui
xfce4-terminalpeut être activé dans les préférences
xtermnon
terme rétro coolnon
lxterminalnon
gnome-terminalnon

Il est trop long pour taper echo $'\a' , j'ai donc créé un alias de wake .


Alias


Par défaut, les commandes cp , scp et rm fonctionnent de manière non récursive et ça craint! C'est un sacré mauvais héritage! Eh bien, il peut être corrigé à l'aide d'alias. Mais regardons d'abord quand un comportement non récursif peut être utile.


 $ mkdir foodir $ cp * foodir 

Seuls les fichiers seront copiés dans foodir , mais pas les répertoires. La même situation va avec rm :


 $ rm * 

supprimera uniquement les fichiers et les liens symboliques, mais conservera les répertoires. Mais à quelle fréquence avez-vous besoin de cette fonctionnalité? J'aime à penser que cp et rm fonctionnent toujours récursivement.


D'accord, mais qu'en est-il de la sécurité? Peut-être qu'un comportement non récursif protège vos fichiers? Il y a un cas où vous avez un lien symbolique vers le répertoire et que vous souhaitez supprimer ce lien symbolique, mais conservez le répertoire. Si une barre oblique est ajoutée (intentionnellement ou occasionnellement) au nom du répertoire et que le mode récursif est activé via -r , le répertoire deviendra vide! VIDE!


 $ ln -s foodir dir_link $ rm -r dir_link/ 

Sans -r arg, il abusera et ne supprimera rien. Ainsi, la rm récursive augmente un peu le risque de perdre des données.


J'ai activé le mode récursif pour cp , scp et rm , et j'ai également ajouté -p pour mkdir pour créer facilement des répertoires imbriqués.


 alias cp='cp -r' alias scp='scp -r' alias rm='rm -r' alias mkdir='mkdir -p' 

Depuis deux ans, je n'ai jamais regretté ces alias et jamais perdu de données. Il y a aussi un inconvénient: il est possible de copier / supprimer moins de données que nécessaire et de ne pas les voir lorsque vous travaillez sur le système sans alias. Alors, soyez prudent. Je sais ce que je fais et je lance toujours rm avec prudence.


Les plus ls sont les alias ls et vous les utilisez probablement déjà:


 alias ls='ls -F --color=auto' alias la='ls -A' alias ll='ls -lh' alias lla='ll -A' 

Un grep coloré est également beaucoup plus joli qu'incolore:


 alias grep='grep --colour=auto' 

Les alias ne fonctionnent pas dans les scripts, n'oubliez pas ce fait! Vous devez spécifier explicitement tous les arguments.


Saisie tactile


C'est évident, mais je vous rappelle que la saisie tactile aide à taper plus vite. Ce sera difficile au début, mais vous dépasserez les limites avec le temps.


Le meilleur moment pour apprendre la saisie tactile est les vacances, quand personne ne vous dérange. S'il vous plaît ne vous précipitez pas lors de l'apprentissage! Votre objectif est de mémoriser l' emplacement de chaque personnage, non pas tant avec votre esprit qu'avec vos doigts. Il vaut mieux taper lentement, mais sans erreurs plutôt que rapidement avec des erreurs. N'oubliez pas que les maîtres ont de bons résultats non pas avec des doigts rapides mais sans faire d'erreurs.


N'oubliez pas de faire une pause. Votre cerveau et vos doigts doivent se reposer. Lorsque des erreurs commencent à apparaître, cela signifie que vous devez faire une pause.


C'est tout pour aujourd'hui


J'espère que ces conseils vous aideront vraiment. Bonne chance!

Source: https://habr.com/ru/post/fr481940/


All Articles