Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
doc:programmation:bash:config [16/02/2014 15:34] MicP [Dépieçage d'un Script contenant des Alias] |
doc:programmation:bash:config [16/08/2023 01:05] (Version actuelle) Switch [Configuration utilisateur] ajout image exemple prompt coloré |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Dépièçage d'un Script contenant des Alias ====== | + | ====== Bash, découverte avancée ====== |
- | LOL | + | |
- | ===== Scripts existants dans ~/user ou /root ===== | + | * Objet : Comprendre à quoi servent les différentes configurations de bash |
+ | * Niveau requis : {{tag>débutant avisé}} | ||
+ | * Commentaires : //Bash possède bon nombre d'options et de fichiers de configurations. Comment comprendre tout ça ?// | ||
+ | * Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-) | ||
+ | * Suivi : {{tag>à-compléter à-tester}} | ||
+ | * Création par : [[user>devpsp]] le 18/08/2010 15:05 | ||
+ | * Testé par : | ||
+ | * Commentaires sur le forum : [[https://debian-facile.org/viewtopic.php?id=12294 | ici]]((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) | ||
- | Il y a 4 fichiers cachés (cachés, car le nom du fichier commence par un point "''.''"), dans votre répertoire utilisateur (/home/user noté aussi simplement ~/) : | + | **Nota :** Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli ! |
- | -.profile | + | ===== Les scripts de configuration ===== |
- | -.bashrc | + | |
- | -.bash_logout | + | |
- | -.bash_history | + | |
- | Ce sont des fichiers de script ''shell'', permettant de définir l'environnement de l'interface en ligne de commande. | + | Bash possède comme la plupart des logiciels des fichiers de configuration globaux à tout le système, rangés dans ''/etc'' et des fichiers personnels, fichiers cachés((cachés: le nom du fichier commence par un point : « ''.'' », ils apparaissent avec un ''ls -a''.)) rangés dans le répertoire utilisateur (« ''~'' »). |
- | Les scripts concernant tous les utilisateurs du système se trouvent ici : | + | Les scripts concernant tous les utilisateurs du système sont les suivants : |
- | */etc/profile | + | * /etc/profile |
- | */etc/bash.bashrc | + | * /etc/bash.bashrc |
+ | Les fichiers de configuration personnels sont les suivants | ||
+ | * ''.bash_profile'' ou ''.bash_login'' ou ''.profile'' | ||
+ | * ''.bashrc'' | ||
- | ===== Localisation des scripts dans l'arborescence du système de fichiers===== | + | * ''.bash_logout'' |
- | Les chemins d'accès sont déclarés dans le fichier ''/etc/profile'' | + | * ''.bash_history'' |
- | * Pour les utilisateurs : /usr/local/bin:/usr/bin:/bin:/usr/games | + | Au lancement d'un shell de login (par exemple via ssh ou dans un tty), **bash** interprète le fichier ''/etc/profile'' s'il existe, puis le fichier ''~/.bash_profile''. |
- | * Pour les administrateurs : /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin | + | |
- | **/etc/profile** concerne tous les utilisateurs : | + | S'il ne trouve pas ce dernier, il essaye d'interpréter le fichier ''~/.bash_login'', et à défaut tente le fichier ''~/.profile''. |
- | Pour visualiser le fichier ''/etc/profile'' de votre installation, entrez la commande : | + | Il est possible de simuler un shell de login en tapant |
- | <code user>cat /etc/profile</code> | + | <code user>bash -l</code> |
- | <file bash /etc/profile> | + | |
- | # /etc/profile: system-wide .profile file for the Bourne shell (sh(1)) | + | Au lancement d'un shell non-interactif, c'est le fichier ''/etc/bash.bashrc'' qui est lu, suivi de ''~/.bashrc''. |
- | # and Bourne compatible shells (bash(1), ksh(1), ash(1), ...). | + | |
+ | |||
+ | ===== Configuration globale ===== | ||
+ | |||
+ | ==== Le fichier ''/etc/profile'' ==== | ||
+ | |||
+ | === PATH : Chemins contenant les exécutables === | ||
+ | Les chemins contenant les exécutables sont déclarés dans la variable d'environnement PATH via le fichier ''/etc/profile'' | ||
+ | |||
+ | * Pour les utilisateurs : /usr/local/bin:/usr/bin:/bin:/usr/games | ||
+ | * Pour l'administrateur : /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin | ||
- | if [ "`id -u`" -eq 0 ]; then | + | Voici l'extrait du ''/etc/profile'' définissant les PATH : |
+ | <file bash /etc/profile>if [ "`id -u`" -eq 0 ]; then | ||
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" | PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" | ||
else | else | ||
PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" | PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games" | ||
fi | fi | ||
- | export PATH | + | export PATH</file> |
- | if [ "$PS1" ]; then | + | Ici 4 chemins sont indiqués, séparés par le caractère "'':''". \\ |
+ | Vous pouvez les utiliser ainsi : | ||
+ | |||
+ | */usr/local/bin : Vos premiers script à mettre ici pour votre système local (pleins de petits scripts) | ||
+ | */usr/bin : ici pour les scripts avancés, pour d'autres utilisateurs (des scripts avec des menus) | ||
+ | */bin : ici il y en a déjà beaucoup, pour les scripts assurément finis (assez gros, avec des fonctions internes à vos scripts et aux autres) | ||
+ | */usr/games : il y en a déjà pas mal concernant les jeux... | ||
+ | |||
+ | === Chargement des options spécifiques à bash === | ||
+ | |||
+ | Le fichier ''/etc/profile'' vérifie ensuite d'il s'agit d'un shell bash interractif. Si c'est le cas, il charge les options globales spécifiques à //bash// (contenues dans ''/etc/bash.bashrc''). | ||
+ | |||
+ | <file bash /etc/profile>if [ "$PS1" ]; then | ||
if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then | if [ "$BASH" ] && [ "$BASH" != "/bin/sh" ]; then | ||
- | # The file bash.bashrc already sets the default PS1. | ||
- | # PS1='\h:\w\$ ' | ||
if [ -f /etc/bash.bashrc ]; then | if [ -f /etc/bash.bashrc ]; then | ||
. /etc/bash.bashrc | . /etc/bash.bashrc | ||
Ligne 56: | Ligne 82: | ||
fi | fi | ||
fi | fi | ||
- | fi | + | fi</file> |
+ | Dans le cas contraire, il définit les prompts minimaux pour root et pour les utilisateurs. | ||
- | # The default umask is now handled by pam_umask. | + | === Chargement des configurations externes === |
+ | |||
+ | Enfin, ''/etc/profile'' charge les fichiers de configuration externes (potentiellement installés par l'utilisateur ou par d'autres paquets Debian), situés dans ''/etc/profile.d/'': | ||
+ | <file bash /etc/profile># The default umask is now handled by pam_umask. | ||
# See pam_umask(8) and /etc/login.defs. | # See pam_umask(8) and /etc/login.defs. | ||
Ligne 68: | Ligne 98: | ||
done | done | ||
unset i | unset i | ||
- | fi | + | fi</file> |
- | </file> | + | |
+ | ==== Le fichier ''/etc/bash.bashrc'' ==== | ||
+ | FIXME | ||
- | Ici 4 chemins sont indiqués, séparés par le caractère "'':''". \\ | + | ===== Configuration utilisateur ===== |
- | Vous pouvez les utiliser ainsi : | + | |
- | */usr/local/bin : Vos premiers script à mettre ici pour votre système local (pleins de petits scripts) | + | Ces scripts ne concernent que l'utilisateur dans le dossier personnel duquel ils se trouvent. |
- | */usr/bin : ici pour les scripts avancés, pour d'autres utilisateurs (des scripts avec des menus) | + | Ce sont des fichiers cachés, leur nom débute avec un point. |
- | */bin : ici il y en a déjà beaucoup, pour les scripts assurément finis (assez gros, avec des fonctions internes à vos scripts et aux autres) | + | |
- | */usr/games : il y en a déjà pas mal concernant les jeux... | + | |
- | ===== Scripts dans le /home/user ===== | + | Mais si vous utilisez simplement [[:doc:systeme:ls |la commande "ls"]] ainsi : |
+ | <code user>ls</code> | ||
+ | Vous obtenez : | ||
+ | <file config retour de la commande> | ||
+ | 2010-02-26--10.13.22 fstab phpmyadmin.png | ||
+ | caisse_060810.ods gparted1.png resilier-sfr | ||
+ | commande_sed1.txt liste-mail RMLL_2.m4v | ||
+ | commande_sed2.txt konversation scripts_user | ||
+ | debian-504-i386-netinst.iso listecamera_site site_agen_100806.ods | ||
+ | debian-facile-le-magazine.pdf liste_site.ods site_agen_100809.ods | ||
+ | default | ||
+ | .../...</file> | ||
- | Ces scripts ne concernent que l'utilisateur (/home/**user**). Où user est votre **login**.\\ | + | Ce sont vos fichiers simples présents dans votre //home//. \\ |
- | Ce sont des fichiers cachés, leur nom débute avec un point. | + | Mais avec son option ''-l'' ainsi : |
+ | <code user>ls -a</code> | ||
+ | vous verrez en plus __tous les fichiers cachés__ : | ||
+ | <file config retour de la commande> | ||
+ | . .gnome2_private nfs-df.odt | ||
+ | .. .gnupg .openoffice.org | ||
+ | 2010-02-26--10.13.22 gparted1.png .openoffice.org2 | ||
+ | .aptitude .gstreamer-0.10 out.ogv | ||
+ | .../...</file> | ||
- | ==== .profile ==== | + | ==== ~/.bash_profile, ~/.bash_login et ~/.profile ==== |
- | ''.profile'' (//avec un point devant !//) est le fichier qui est interprété au lancement de la console. | + | On voit que le fichier ''~/.bash_profile'' par défaut ne fait rien d'autre que charger le ''~/.bashrc''. |
- | Pour afficher votre propre fichier, tapez : | + | <file bash ~/.bash_profile>if [ -f ~/.bashrc ]; then |
- | <code user> | + | . ~/.bashrc |
- | cat ~/.profile | + | fi</file> |
- | # ~/.profile: executed by the command interpreter for login shells. | + | |
- | # This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login | + | De même, le ''~/.profile'' par défaut vérifie que le shell est bien bash, puis interprète le ''~/.bashrc''. |
- | # exists. | + | <file bash ~/.profile>if [ -n "$BASH_VERSION" ]; then |
- | # see /usr/share/doc/bash/examples/startup-files for examples. | + | # include .bashrc if it exists |
- | # the files are located in the bash-doc package. | + | if [ -f "$HOME/.bashrc" ]; then |
- | + | . "$HOME/.bashrc" | |
- | # the default umask is set in /etc/profile; for setting the umask | + | |
- | # for ssh logins, install and configure the libpam-umask package. | + | |
- | #umask 022 | + | |
- | + | ||
- | # if running bash | + | |
- | if [ -n "$BASH_VERSION" ]; then | + | |
- | # include .bashrc if it exists | + | |
- | if [ -f "$HOME/.bashrc" ]; then | + | |
- | . "$HOME/.bashrc" | + | |
- | fi | + | |
fi | fi | ||
- | + | fi</file> | |
- | # set PATH so it includes user's private bin if it exists | + | |
- | if [ -d "$HOME/bin" ] ; then | + | |
- | PATH="$HOME/bin:$PATH" | + | |
- | fi | + | |
- | </code> | + | |
- | Ce fichier déclare au système : | + | Il vérifie en plus si le dossier ''~/bin'' existe, et, le cas échéant, l'ajoute au PATH. |
- | - un fichier (.bashrc dans votre /home/user) et | + | <file bash ~/.profile>if [ -d "$HOME/bin" ] ; then |
- | - un chemin (répertoire /bin dans votre /home/user). | + | PATH="$HOME/bin:$PATH" |
+ | fi</file> | ||
- | C'est dans ce fichier (**/home/user/.bashrc**) ou dans les fichiers du répertoire **/home/user/bin**) que seront interprétées les commandes saisies dans la console. \\ | + | ==== ~/.bashrc ==== |
- | Les principales commandes étant contenues dans le répertoire **/bin** de la racine. | + | |
- | ==== .bashrc ==== | + | Le fichier ''~/.bashrc'' est celui contenant la réelle configuration utilisateur de **bash**. |
- | Pour afficher votre propre fichier ''.bashrc'', tapez : | + | === Uniquement pour le mode interactif === |
- | <code user>cat ~/.bashrc</code> | + | Il commence par vérifier qu'il est bien lancé par un utilisateur et non interpréteur d'un script((via #!/bin/bash)). Il s'arrête si ça n'est pas le cas. |
- | + | <code bash ~/.bashrc>case $- in | |
- | Voici le début du script : | + | *i*) ;; |
- | <code> | + | *) return;; |
- | # ~/.bashrc: executed by bash(1) for non-login shells. | + | esac</code> |
- | # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) | + | |
- | # for examples</code> | + | === Historique === |
+ | |||
+ | Les lignes suviantes concernent la configuration de l'historique de bash. | ||
+ | <file bash ~/.bashrc>HISTCONTROL=ignoreboth | ||
+ | shopt -s histappend | ||
+ | HISTSIZE=1000 | ||
+ | HISTFILESIZE=2000</file> | ||
+ | Ici, l'historique ne stocke pas les doublons, conserve le précédent historique, mais le limite à 1000 lignes et 2ko. | ||
+ | |||
+ | === Taille du terminal === | ||
+ | Il met à jour la les variables d'environnement de taille du terminal: | ||
+ | <file bash ~/.bashrc>shopt -s checkwinsize</file> | ||
+ | |||
+ | === Chroot === | ||
+ | Il définit la variable debian_chroot s'il trouve un fichier ''/etc/debian_chroot''. Cette variable sera ensuite utilisée dans le prompt. | ||
+ | <file bash ~/.bashrc>if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then | ||
+ | debian_chroot=$(cat /etc/debian_chroot) | ||
+ | fi</file> | ||
+ | |||
+ | === Terminal en couleur === | ||
+ | Il tente de déterminer par plusieurs moyens s'il s'agit d'un terminal couleur ou non : | ||
+ | <file bash ~/.bashrc>case "$TERM" in | ||
+ | xterm-color) color_prompt=yes;; | ||
+ | esac | ||
+ | |||
+ | #force_color_prompt=yes | ||
+ | |||
+ | if [ -n "$force_color_prompt" ]; then | ||
+ | if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then | ||
+ | color_prompt=yes | ||
+ | else | ||
+ | color_prompt= | ||
+ | fi | ||
+ | fi</file> | ||
+ | Vous pouvez forcer la détection en décommentant ''#force_color_prompt=yes''. | ||
+ | |||
+ | === Prompt === | ||
+ | |||
+ | Il définit le prompt suivant que le terminal soit en couleur ou non : | ||
+ | <file bash ~/.bashrc>if [ "$color_prompt" = yes ]; then | ||
+ | PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' | ||
+ | else | ||
+ | PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' | ||
+ | fi | ||
+ | unset color_prompt force_color_prompt</file> | ||
+ | |||
+ | <note tip>Il est possible de configurer son prompt avec des éléments et des couleurs de votre choix. Il suffit de configurer la variable $PS1 vous même dans votre fichier de configuration .bashrc. Exemple :<file config nom> | ||
+ | PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$' | ||
+ | </file> {{/file-R71cdd53a1ad2a7e72584f602d833b88e.png}} [[https://www.howtogeek.com/307701/how-to-customize-and-colorize-your-bash-prompt/|Article détaillant les codes couleurs et éléments possibles]] , ou un générateur de prompt en ligne, pratique : [[https://ezprompt.net/|https://ezprompt.net/]] </note> | ||
+ | |||
+ | |||
+ | === Titre du terminal === | ||
+ | Si le terminal est compatible xterm ou rxvt, il change le prompt de manière à changer le titre tu terminal. | ||
+ | <file bash ~/.bashrc># If this is an xterm set the title to user@host:dir | ||
+ | case "$TERM" in | ||
+ | xterm*|rxvt*) | ||
+ | PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" | ||
+ | ;; | ||
+ | *) | ||
+ | ;; | ||
+ | esac</file> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | === Alias === | ||
+ | |||
+ | Les alias sont des outils très pratiques, voir [[:doc:programmation:bash:alias]] pour un description plus approfondie. | ||
+ | |||
+ | Le fichier ''~/.bashrc'' commence par définir des alias colorés pour ls dans le cas d'un terminal coloré : | ||
+ | <file bash ~/.bashrc># enable color support of ls and also add handy aliases | ||
+ | if [ -x /usr/bin/dircolors ]; then | ||
+ | test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" | ||
+ | alias ls='ls --color=auto' | ||
+ | #alias dir='dir --color=auto' | ||
+ | #alias vdir='vdir --color=auto' | ||
+ | |||
+ | #alias grep='grep --color=auto' | ||
+ | #alias fgrep='fgrep --color=auto' | ||
+ | #alias egrep='egrep --color=auto' | ||
+ | fi</file> | ||
+ | |||
+ | Le fichier propose ensuite de définir quelques alias bien pratiques : | ||
+ | <file bash ~/.bashrc># some more ls aliases | ||
+ | #alias ll='ls -l' | ||
+ | #alias la='ls -A' | ||
+ | #alias l='ls -CF'</file> | ||
+ | |||
+ | Enfin, si le fichier ''~/.bash_aliases'' existe, il l'interprète : | ||
+ | <file bash ~/.bashrc>if [ -f ~/.bash_aliases ]; then | ||
+ | . ~/.bash_aliases | ||
+ | fi</file> | ||
+ | |||
+ | Aussi, si vous voulez définir des alias personnels, la méthode la plus propre et portable est de les définir dans un fichier ''~/.bash_aliases'', à créer. | ||
+ | |||
+ | === Autocomplétion === | ||
+ | |||
+ | Bash tente enfin de charger [[:doc:programmation:bash:autocompletion|l'autocomplétion]] si elle est disponible et souhaitable : | ||
+ | <file bash ~/.bashrc>if ! shopt -oq posix; then | ||
+ | if [ -f /usr/share/bash-completion/bash_completion ]; then | ||
+ | . /usr/share/bash-completion/bash_completion | ||
+ | elif [ -f /etc/bash_completion ]; then | ||
+ | . /etc/bash_completion | ||
+ | fi | ||
+ | fi</file> | ||
| | ||
- | Je n'ai pas mis tout le début du script (assez long, peu utile ici). | + | ==== ''~/.bash_logout'' ==== |
- | Pas besoin de modifier ce qui y est déclaré... Éventuellement, vous y reviendrez plus tard. | + | Le fichier ''~/.bash_logout'' s'occupe d'effacer le terminal à la déconnexion : |
+ | <file bash ~/.bash_logout> | ||
+ | if [ "$SHLVL" = 1 ]; then | ||
+ | [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q | ||
+ | fi</file> | ||
- | **La suite du fichier nous intéresse...**\\ | + | ==== ''~/.bash_history'' ==== |
- | Cette partie traite des alias (raccourcis) pour vous simplifier la vie, rechercher plus bas dans le fichiers les lignes suivantes : | + | |
+ | Contient tout [[:doc:programmation:bash:history]|l'historique des commandes]] que vous avez saisies. | ||
+ | ===== Voir aussi ===== | ||
+ | * [[doc:programmation:shells:debuter-avec-les-scripts-shell-bash | Apprendre à rédiger des scripts sous bash]] |