Comment personnaliser l'invite de commande

Je suis un grand fan du terminal: que vous utilisiez une poignée de commandes (ou plus!) Pour améliorer votre processus de développement, ou que vous vous en serviez simplement pour déplacer rapidement vos lecteurs et ouvrir des fichiers et des dossiers, la ligne de commande est la suivante: un outil génial. Cependant, si vous l'utilisez souvent, vous voudrez le personnaliser selon vos besoins. Je vais vous montrer comment faire cela aujourd'hui!

On me demande souvent: "Comment avez-vous obtenu votre invite de commande pour qu'elle ressemble à cela?" Eh bien, dans ce tutoriel, je vais vous montrer exactement comment le faire. C'est assez simple et ne vous demandera pas trop de temps.

Je devrais noter que ce que je vous montre est spécifiquement pour le shell bash; C'est le shell par défaut sur Mac et la plupart des systèmes Linux. Si vous souhaitez une invite bash sous Windows, vous pouvez consulter Cygwin..


Comment ça marche?

Avant de commencer, parlons un instant de la façon dont vous personnalisez votre invite bash. Ce n'est pas tout à fait la même chose qu'une application moyenne: il n'y a pas de panneau de préférences. Vos personnalisations sont stockées dans un fichier. Si vous utilisez Linux (ou utilisez Cygwin), ce sera votre .bashrc fichier; sur Mac, c'est votre .bash_profile fichier. Dans les deux cas, ce fichier est conservé dans votre répertoire personnel (si vous n'êtes pas sûr de son emplacement pour une installation Cygwin, exécutez la commande echo $ HOME). Notez que je ne parlerai que du .bashrc fichier à partir de maintenant, mais utilisez le .bash_profile si vous êtes sur un Mac.

Notez que sur les Mac (et peut-être même les machines Linux; je ne suis pas sûr), les fichiers commençant par un point sont masqués par défaut. Pour les montrer, lancez ces deux lignes dans le terminal

Par défaut, écrivez com.apple.finder AppleShowAllFiles TRUE killall Finder

Alors, qu'est-ce qui se passe dans ça .bashrc fichier? Chaque ligne est en fait une commande que vous pouvez exécuter sur la ligne de commande. En fait, voici comment fonctionnent ces fichiers de configuration: Lorsque vous ouvrez la console, toutes les commandes que vous avez écrites dans le fichier de configuration sont exécutées pour configurer votre environnement. Donc, si vous voulez juste essayer une partie de ce que je vais montrer ci-dessous, tapez-le simplement sur la ligne de commande elle-même. La simplicité est belle ici.


Personnalisation PS1

Commençons par une définition. le rapide est ce que vous voyez au début de la ligne, chaque fois que vous appuyez sur Entrée sur la ligne de commande. Voici quels sont les paramètres par défaut pour le Mac:

Dans ce cas, l'invite est andrews-macbook: ~ screencast $. Il y a quelques variables ici: andrew-macbook est le nom de cet ordinateur, ~ est le répertoire actuel (le répertoire de base) et screencast est le nom d'utilisateur. Personnalisons un peu.

Ouvrez soit votre .bashrc fichier. La façon dont nous définissons les informations affichées dans l’invite s’effectue avec PS1 variable. Ajoutez ceci au fichier:

PS1 = '->'

Notez que je ne mets pas d'espaces de part et d'autre du signe égal; c'est nécessaire. Enregistrez ce fichier dans votre répertoire personnel et rouvrez une fenêtre de terminal. Maintenant, vous devriez avoir une invite qui ressemble à ceci:

Je ferai remarquer ici que si vous trouvez fastidieux de fermer et de rouvrir votre terminal chaque fois que vous modifiez votre .bashrc ou .bash_profile, un raccourci: vous pouvez charger n’importe quel fichier de personnalisation de bash avec le la source commander. Exécutez ceci dans votre terminal:

source ~ / .bashrc

Encore trop longtemps? Eh bien, une seule période (.) est un alias pour la source. Heureux maintenant? Si vous êtes rapide, vous réaliserez que nous pouvons utiliser le la source commande d'inclure d'autres fichiers dans notre .bashrc fichier, si vous voulez le scinder pour garder le contrôle.

Personnalisons un peu plus notre invite. Nous pouvons utiliser des variables intégrées dans la chaîne à laquelle nous attribuons PS1 inclure des informations utiles dans l'invite; en voici quelques unes utiles:

  • \ré: Rendez-vous amoureux
  • \ h: Hôte
  • \ n: Nouvelle ligne
  • \ t: Temps
  • \ u: Nom d'utilisateur
  • \ W: Répertoire de travail actuel
  • \ w: Chemin complet du répertoire actuel

Donc, si vous configurez votre invite à ceci:

PS1 = '\ n \ W \ n [\ h] [\ u] ->'

vous devriez voir quelque chose comme ceci:

Remarquez quelques choses ici: premièrement, nous utilisons un ensemble des variables présentées ci-dessus pour nous donner plus d'informations. Mais deuxièmement, nous incluons quelques lignes nouvelles et nous obtenons une invite plus intéressante: nous avons le répertoire actuel sur une ligne, puis l’invite réelle sur la ligne suivante. Je préfère mon invite de cette façon, car j’ai toujours la même quantité d’espace pour écrire mes commandes, quelle que soit la longueur du chemin du répertoire en cours. Cependant, il y a une meilleure façon de faire cela, alors regardons cela maintenant.


Personnalisation PROMPT_COMMAND

La meilleure façon de faire est d'utiliser le PROMPT_COMMAND variable; le contenu de cette variable n'est pas simplement une chaîne, comme avec PS1. C'est en fait une commande qui a été exécutée avant que bash affiche l'invite. Pour essayer, ajoutons ceci à notre .bashrc:

PROMPT_COMMAND = 'echo "vient avant l'invite"'

Nous utilisons le écho commande ici; si vous ne le connaissez pas, il vous suffit de lui passer une chaîne et il l'écrira sur le terminal. En soi, ce n'est pas incroyablement utile (même si vous pouvez l'utiliser pour afficher des variables: echo $ PS1), mais c’est génial quand on l’utilise avec d’autres commandes, affichez donc leur sortie. Si vous avez ajouté la ligne ci-dessus, vous devriez voir ceci:

Faisons quelque chose de plus utile ici. Ecrivons une fonction bash que nous assignerons à PROMPT_COMMAND. Essaye ça:

print_before_the_prompt () echo "vient avant l'invite" PROMPT_COMMAND = print_before_the_prompt

Si vous utilisez ceci, vous ne devriez pas voir une différence dans votre invite par rapport à ce que nous avons ci-dessus. Faisons en sorte que cela soit utile.

print_before_the_prompt () echo "$ USER: $ PWD" PROMPT_COMMAND = print_before_the_prompt PS1 = "->"

Voici ce que vous obtiendrez:

C'est un bon début, mais je veux faire un peu plus. Je vais utiliser le printf commande au lieu de écho car cela facilite l’inclusion de nouvelles lignes et de variables. Un bref historique sur le printf commande: il faut plusieurs paramètres, le premier étant une sorte de template pour la chaîne à sortir. Les autres paramètres sont des valeurs qui seront substituées dans la chaîne de modèle, le cas échéant; nous verrons comment cela fonctionne.

Alors faisons ceci:

print_before_the_prompt () printf "\ n% s:% s \ n" "$ USER" "$ PWD"

Voir ceux % s pièces dedans là? Cela signifie que "interprète la valeur de ce spot en tant que chaîne" ;; pour le contexte, nous pourrions aussi utiliser %ré pour formater la valeur sous forme de nombre décimal. Comme vous pouvez le voir, nous avons deux % sest dans le? template? chaîne et deux autres paramètres. Ceux-ci seront placés dans la chaîne où le % ss sont. Notez également les nouvelles lignes au début et à la fin: la première donne simplement un peu de marge de manœuvre au terminal. Le dernier s'assure que l'invite (PS1) sera imprimé sur la ligne suivante et non sur la même ligne que PROMPT_COMMAND.

Vous devriez obtenir un terminal comme celui-ci:


Ajout de couleur

Vous cherchez bien! Mais allons un peu plus loin. Ajoutons de la couleur à cela. Nous pouvons utiliser des codes spéciaux pour changer la couleur du texte dans le terminal. Il peut être assez décourageant d’utiliser le code lui-même, aussi j’aime copier cette liste de variables pour la couleur et l’ajouter en haut de la liste. .bashrc fichier:

txtblk = '\ e [0; 30m' # Noir - Régulier txtred = "\ e [0; 31m" # Rouge txtgrn = "\ e [0; 32m" # Vert txtylw = "\ e [0; 33m" # Jaune txtblu = "\ e [0; 34m" # Blue txtpur = "\ e [0; 35m" # Violet txtcyn = "\ e [0; 36m" # Cyan txtwht = "\ e [0; 37m" # Blanc bldblk = "\ e [1; 30m" # Black - Bold bldred = "\ e [1; 31m" # Red bldgrn = "\ e [1; 32m" # Green bldylw = "\ e [1; 33m" # Yellow bldblu = "\ e [1; 34m" # Blue bldpur = "\ e [1; 35m" # Violet bldcyn = "\ e [1; 36m" # Cyan bldwht = "\ e [1; 37m" # Blanc unkblk = "\ e [4; 30m "# Noir - Souligné undred =" \ e [4; 31m "# Rouge undgrn =" \ e [4; 32m "# Vert undylw =" \ e [4; 33m "# Jaune undblu =" \ e [4; 34m "# Blue undpur =" \ e [4; 35m "# Violet undcyn =" \ e [4; 36m "# Cyan undwht =" \ e [4; 37m "# White bakblk =" \ e [ 40m "# Noir - Fond bakred =" \ e [41m "# Rouge badgrn =" \ e [42m "# Vert bakylw =" \ e [43m "# Jaune bakblu =" \ e [44m "# Bleu bakpur =" \ e [45m "# Violet bakcyn =" \ e [46m "# Cyan bakwht =" \ e [47m "# Blanc txtrst =" \ e [0m "# Réinitialisation du texte

Il y a une méthode à cette folie: les premiers jeux sont allumés en coloration normale. La deuxième série active les couleurs vives. La troisième série active la coloration soulignée. Et cette quatrième série active la coloration de l’arrière-plan. Ce dernier réinitialise la coloration à la normale. Alors, utilisons ces!

print_before_the_prompt () printf "\ n $ txtred% s: $ bldgrn% s \ n $ txtrst" "$ USER" "$ PWD"

Ici, j'ai ajouté $ txtred avant le premier % s, et $ bldgrn avant la seconde % s; puis, à la fin, j'ai réinitialisé la couleur du texte. Vous devez le faire, car une fois que vous avez défini une couleur, elle sera conservée jusqu'à ce que vous utilisiez une nouvelle couleur ou réinitialisiez la coloration. Vous remarquerez également que lorsque vous définissez une variable, nous ne la préfixons pas par un signe dollar; mais nous utilisons le signe dollar lorsque nous utilisons la variable: c'est ainsi que fonctionnent les variables bash. Cela nous donne les éléments suivants:

Passons à la dernière étape: ajouter des scripts pour nous donner encore plus d'informations..


Ajout d'informations de contrôle de version

Si vous avez visionné les screencasts fournis avec mon livre Getting Good with Git, vous vous souviendrez peut-être que certaines informations relatives au contrôle de version sont affichées dans mon invite. J'ai eu cette idée de l'excellent PeepCode? Advanced Command Line? screencast, qui partage cela, ainsi que de nombreux autres bons conseils.

Pour ce faire, nous devrons télécharger et créer le script qui trouve cette information. Rendez-vous sur le référentiel pour vcprompt, un script qui génère les informations de contrôle de version. Si vous connaissez le système de contrôle de version Mercurial, vous pouvez l'utiliser pour obtenir le référentiel, mais vous voudrez probablement cliquer sur ce lien 'zip' pour télécharger le code de script sous forme de fichier zip. Une fois le fichier décompressé, vous devez créer le script. Pour ce faire, juste CD dans le dossier de script décompressé et exécutez la commande faire. Une fois cette commande exécutée, vous devriez voir un fichier nommé 'vcprompt' dans le dossier. Ceci est le script exécutable.

Alors, comment utilisons-nous cela dans notre invite? Eh bien, cela nous amène à une importante piste de lapins: comment pouvons-nous? Installer? un script (comme celui-ci) afin que nous puissions l'utiliser dans le terminal? Toutes les commandes que vous pouvez exécuter sur le terminal se trouvent dans un tableau défini de dossiers. ce tableau est la variable PATH. Vous pouvez voir une liste des dossiers actuellement dans votre PATH en lançant echo $ PATH. Cela pourrait ressembler à quelque chose comme ça:

/ usr / bin: / bin: / usr / sbin: / sbin: / usr / local / bin: / usr / X11 / bin

Ce que nous devons faire est de mettre le script exécutable vcprompt dans un dossier qui est sur notre chemin. Ce que j’aime faire (et oui, j’ai appris cette astuce à partir du screencast de PeepCode également), c’est de créer un dossier appelé "bin" (abréviation de "binary") dans mon répertoire personnel et de l’ajouter à mon chemin PATH. Ajoutez ceci à votre .bashrc:

export PATH = ~ / bin: $ PATH

Ceci configure PATH sur ~ / bin, plus tout ce qui était déjà dans la variable PATH. Si nous mettons maintenant que vcprompt script dans ~ / bin, nous pourrons l'exécuter dans n'importe quel dossier du terminal.

Alors, ajoutons maintenant ceci à notre invite:

print_before_the_prompt () printf "\ n $ txtred% s: $ bldgrn% s $ txtpur% s \ n $ txtrst" "$ USER" "$ PWD" "$ (vcprompt)"

J'ai ajouté $ txtpur% s au? modèle? chaîne, et ajouté le quatrième paramètre"$ (vcprompt)". L'utilisation du signe dollar et des parenthèses exécutera le script et renverra le résultat. Maintenant, vous aurez ceci:

Notez que si le dossier n'utilise pas un contrôle de version, rien ne s'affiche. Mais si nous sommes dans un référentiel, nous obtenons le système de contrôle de version utilisé (Git, dans mon cas) et le nom de la branche. Vous pouvez personnaliser un peu cette sortie si vous le souhaitez: vérifiez le fichier Lisezmoi que vous avez téléchargé avec le code source du fichier. vcprompt scénario.


En route!

Voici notre complète .bashrc ou .bash_profile fichier:

export PATH = ~ / bin: $ PATH txtblk = "\ e [0; 30m" # Noir - Normal txtred = "\ e [0; 31m" # Rouge txtgrn = "\ e [0; 32m" # Vert txtylw = " \ e [0; 33m "# Jaune txtblu =" \ e [0; 34m "# Bleu txtpur =" \ e [0; 35m "# Violet txtcyn =" \ e [0; 36m "# Cyan txtwht =" \ e [0; 37m "# Blanc bldblk =" \ e [1; 30m "# Noir - Gras bldred =" \ e [1; 31m "# Rouge bldgrn =" \ e [1; 32m "# Vert bldylw =" \ e [1; 33m "# Jaune bldblu =" \ e [1; 34m "# Bleu bldpur =" \ e [1; 35m "# Violet bldcyn =" \ e [1; 36m "# Cyan bldwht =" \ e [1 ; 37m "# White unkblk =" \ e [4; 30m "# Noir - Souligné undred =" \ e [4; 31m "# Rouge undgrn =" \ e [4; 32m "# Vert undylw =" \ e [4 ; 33m "# Jaune undblu =" \ e [4; 34m "# Bleu undpur =" \ e [4; 35m "# Violet undcyn =" \ e [4; 36m "# Cyan undwht =" \ e [4; 37m "# Blanc bakblk =" \ e [40m "# Noir - Arrière-plan bakred =" \ e [41m "# Rouge badgrn =" \ e [42m "# Vert bakylw =" \ e [43m "# Jaune bakblu =" \ e [44m "# Blue bakpur =" \ e [45m "# Violet bakcyn =" \ e [46m "# Cyan bakwht =" \ e [47m "# Blanc txtrst =" \ e [0m "# Texte Réinitialiser print_before_the_prompt ()  printf "\ n $ txtred% s: $ bldgrn% s $ txtpur% s \ n $ txtrst" "$ USER" "$ PWD" "$ (vcprompt) " PROMPT_COMMAND = print_before_the_prompt PS1 =" -> "

C'est un cours intensif sur la personnalisation de votre invite bash. Si vous avez des questions, assurez-vous de les laisser dans les commentaires!