« Shell bash » : différence entre les versions

De Wiki doc

(→‎arguments : Ajout du "~+" + ajout de la source correspondante.)
(→‎Restriction : Ajout de la coloration syntaxique + ajout d'une source)
 
(6 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
[[Category:shell]]
[[Category:shell]]
Le shell bash est l'interpréteur de commande par défaut de la plupart des distributions Linux. Il peut être personnalisé en modifiant son apparence ou en lui activant des paramètres.
Le ''shell Bash'' est l'interpréteur de commandes par défaut de la plupart des distributions Linux. Il peut être personnalisé en modifiant son apparence ou en lui activant des paramètres.


=Configuration=
=Configuration=
Ligne 8 : Ligne 8 :
* Un local pour chaque utilisateurs en particulier : <source lang="bash" inline>~/.bashrc</source>
* Un local pour chaque utilisateurs en particulier : <source lang="bash" inline>~/.bashrc</source>
Pour que les modifications prennent effet, il faut recharger le fichier après modification soit en relançant le shell, soit en exécutant le fichier comme s'il s’agissait d'une commande <source lang="bash" inline>. .bashrc</source> ou bien en utilisant la commande <source lang="bash" inline>source ~/.bashrc</source>.
Pour que les modifications prennent effet, il faut recharger le fichier après modification soit en relançant le shell, soit en exécutant le fichier comme s'il s’agissait d'une commande <source lang="bash" inline>. .bashrc</source> ou bien en utilisant la commande <source lang="bash" inline>source ~/.bashrc</source>.
===Auto complétion===
===Auto complétion===
Le paquet <source lang="bash" inline>bash-completion</source> offre la possibilité de compléter les commandes bash à l'aide de la tabulation. Il faut entrer les quelques lignes suivantes dans l'un des fichiers de configuration de bash pour que cela prenne effet.
Le paquet <source lang="bash" inline>bash-completion</source> offre la possibilité de compléter les commandes bash à l'aide de la tabulation. Il faut entrer les quelques lignes suivantes dans l'un des fichiers de configuration de bash pour que cela prenne effet.
Ligne 23 : Ligne 24 :
==inputrc==
==inputrc==
===Insensibilité à la casse===
===Insensibilité à la casse===
Rendre insensible l'auto complétion du shell bash à la casse (très utile quand on tape vite au clavier et que le système écrit /Etc au lieu de /etc et dit "Aucun fichier ou dossier de ce type").
Rendre insensible l'auto complétion du ''shell Bash'' à la casse (très utile quand on tape vite au clavier et que le système écrit ''/Etc'' au lieu de ''/etc'' et dit "Aucun fichier ou dossier de ce type").
  vim ~/.inputrc
  vim ~/.inputrc
Ajouter cette ligne :
Ajouter cette ligne :
<source lang="bash">
<source lang="bash">
set completion-ignore-case On
set completion-ignore-case On
</source>
</source>
===Source de la section===
===Source de la section===
http://askubuntu.com/questions/87061/can-i-make-tab-auto-completion-case-insensitive-in-the-terminal
http://askubuntu.com/questions/87061/can-i-make-tab-auto-completion-case-insensitive-in-the-terminal
=Redirections=
=Redirections=
==Rediriger plusieurs lignes==
==Rediriger plusieurs lignes==
Pour ce faire nous utiliserons un EOF (End Of File). Il faut précéder et succéder une chaîne de caractère quelconque par des traits de soulignement afin de marquer le début et la fin de notre bloque de texte (à la manière du ''motd'' Cisco).
Pour ce faire nous utiliserons un EOF (End Of File). Il faut précéder et succéder une chaîne de caractère quelconque par des traits de soulignement afin de marquer le début et la fin de notre bloque de texte (à la manière du ''motd'' Cisco).
===Dans un fichier===
===Dans un fichier===
<source lang="bash">
<source lang="bash">
ycharbi@XPS13:/tmp$ cat >> foo.txt << _bar_
ycharbi@XPS13:/tmp$ cat << '_EOF_' > foo.txt
> Écrire et
> Écrire et
> terminer par le
> terminer par le
> même symbole
> même symbole
> _bar_
> _EOF_
ycharbi@XPS13:/tmp$ cat foo.txt  
ycharbi@XPS13:/tmp$ cat foo.txt  
Écrire et
Écrire et
Ligne 46 : Ligne 52 :
même symbole
même symbole
</source>
</source>
===Dans le shell===
===Dans le shell===
<source lang="bash">
<source lang="bash">
ycharbi@XPS13:/tmp$ cat << _foo_
ycharbi@XPS13:/tmp$ cat << _EOF_
> Écrire et
> Écrire et
> terminer par le
> terminer par le
> même symbole
> même symbole
> _foo_
> _EOF_
Écrire et
Écrire et
terminer par le
terminer par le
même symbole
même symbole
</source>
</source>
{{Astuce|Le fait de mettre des quottes au mot clé de fin de fichier (''_EOF_'' dans l'exemple, mais pourrai être ''toto'') permet de désactiver l'interprétation ''Bash''. Si vous ne les mettez pas, le ''shell'' interprétera le code que vous entrerez (les variables notamment). À vous de voir ce que vous voulez faire. Ceci est expliqué dans ce [http://tldp.org/LDP/abs/html/here-docs.html chapitre] du guide de programmation ''Bash'' avancé repris par ce [https://stackoverflow.com/questions/2953081/how-can-i-write-a-heredoc-to-a-file-in-bash-script commentaire].}}
===Source de la section===
===Source de la section===
* https://www.bggofurther.com/fr/2017/10/write-multiple-lines-to-file-in-bash-script/
* https://www.bggofurther.com/fr/2017/10/write-multiple-lines-to-file-in-bash-script/
=arguments=
 
=Arguments=
Voici une liste d'astuces pour récupérer des arguments tapés en ''bash'':
Voici une liste d'astuces pour récupérer des arguments tapés en ''bash'':
* <source lang="bash" inline><Échap></source>+<source lang="bash" inline>_</source> : colle le dernier argument passé à la dernière commande tapée
{| class="wikitable"
* <source lang="bash" inline>!$</source> : remplace, au moment d'envoyer la commande, le dernier argument passé à la dernière commande tapée
|-
* <source lang="bash" inline>!:n</source> : remplace, au moment d'envoyer la commande, l'nième argument passé à la dernière commande tapée
! Argument !! Signification
* <source lang="bash" inline>^foo^bar</source> : (à entrer seul, sans commande ni argument) permet de remplacer ''foo'' par ''bar'' dans la commande précédente. Un <source lang="bash" inline>ls /etc</source> suivi d'un <source lang="bash" inline>^/etc^/</source> donnera un <source lang="bash" inline>ls /</source>
|-
* <source lang="bash" inline>~+</source> : donne le répertoire courant (est identique à <source lang="bash" inline>$(pwd)</source>)
| <source lang="bash" inline><Échap> + _</source> || Colle le dernier argument passé à la dernière commande tapée
|-
| <source lang="bash" inline>!$</source> || Équivaut, au moment d'envoyer la commande, au dernier argument passé à la dernière commande tapée
|-
| <source lang="bash" inline>!:$</source> || Équivaut, au moment d'envoyer la commande, à l’énième argument passé à la dernière commande tapée (remplacer le <source lang="bash" inline>$</source> par le numéro de l'argument)
|-
| <source lang="bash" inline>!!</source> || Équivaut, au moment d'envoyer la commande, à tout les arguments de la dernière commande tapée
|-
| <source lang="bash" inline>^toto^titi</source> || Permet de remplacer ''toto'' par ''titi'' dans la commande précédente (à entrer seul, sans commande ni argument). Un <source lang="bash" inline>ls /etc</source> suivi d'un <source lang="bash" inline>^/etc^/</source> donnera un <source lang="bash" inline>ls /</source>
|-
| <source lang="bash" inline>~+</source> || Donne le répertoire courant (est identique à <source lang="bash" inline>$(pwd)</source>)
|-
| <source lang="bash" inline><ctrl> + alt + e</source> || Déroule la véritable signification d'un alias. Par exemple, si je tape <source lang="bash" inline>ls</source> suivi de ce raccourci clavier, j'obtiens <source lang="bash" inline>ls --color</source> qui est définit comme alias dans mon <source lang="bash" inline>.bashrc</source>
|-
| <source lang="bash" inline>$_</source> || Correspond au dernier paramètre de la dernière commande exécuté. La différence avec les motifs présentés plus haut est qu'il utilisable même lors d'un enchaînement de commande comme par [https://www.blog-libre.org/2020/04/17/une-presentation-de-systemd-nspawn/ exemple] <source lang="bash" inline>mkdir -p ~/tmp/conteneur && cd $_</source>
|}
 
=Restriction=
Il est possible de restreindre l'usage du ''shell'' pour un utilisateur en exécutant <syntaxhighlight lang="bash" inline>bash</syntaxhighlight>  avec l'option <syntaxhighlight lang="bash" inline>-r</syntaxhighlight> ou en utilisant <syntaxhighlight lang="bash" inline>/usr/bin/rbash</syntaxhighlight> (résultat identique).
 
L'interpréteur ainsi restreint permet de créer un environnement plus contrôlé qu'un interpréteur standard. Il se comporte de même façon que <syntaxhighlight lang="bash" inline>bash</syntaxhighlight> à la différence des actions suivantes qui sont interdites ou non effectuées :
* changer de répertoire avec <syntaxhighlight lang="bash" inline>cd</syntaxhighlight>
* créer ou détruire les valeurs de <syntaxhighlight lang="bash" inline>SHELL</syntaxhighlight>, <syntaxhighlight lang="bash" inline>PATH</syntaxhighlight>, <syntaxhighlight lang="bash" inline>HISTFILE</syntaxhighlight>, <syntaxhighlight lang="bash" inline>ENV</syntaxhighlight> ou <syntaxhighlight lang="bash" inline>BASH_ENV</syntaxhighlight>
* indiquer des noms de commandes contenant un <syntaxhighlight lang="bash" inline>/</syntaxhighlight>
* indiquer un nom de fichier contenant un <syntaxhighlight lang="bash" inline>/</syntaxhighlight> comme argument de la commande interne <syntaxhighlight lang="bash" inline>.</syntaxhighlight>
* indiquer un nom de fichier contenant une barre oblique (<syntaxhighlight lang="bash" inline>/</syntaxhighlight>) comme argument de la  commande interne <syntaxhighlight lang="bash" inline>history</syntaxhighlight>
* indiquer  un  nom de fichier contenant une barre oblique comme argument de l'option <syntaxhighlight lang="bash" inline>-p</syntaxhighlight> de la commande interne <syntaxhighlight lang="bash" inline>hash</syntaxhighlight>
* importer une définition de fonction dans l'environnement au démarrage
* analyser les valeurs de <syntaxhighlight lang="bash" inline>SHELLOPTS</syntaxhighlight> de l'environnement d'interpréteur au démarrage
* rediriger la sortie en utilisant les opérateurs de redirection <syntaxhighlight lang="bash" inline>></syntaxhighlight>, <syntaxhighlight lang="bash" inline>>|</syntaxhighlight>, <syntaxhighlight lang="bash" inline><></syntaxhighlight>, <syntaxhighlight lang="bash" inline>>&</syntaxhighlight>, <syntaxhighlight lang="bash" inline>&></syntaxhighlight> et <syntaxhighlight lang="bash" inline>>></syntaxhighlight>
* utiliser la commande interne <syntaxhighlight lang="bash" inline>exec</syntaxhighlight> pour remplacer l'interpréteur par une autre commande
* ajouter ou supprimer des commandes internes avec les options <syntaxhighlight lang="bash" inline>-f</syntaxhighlight> et <syntaxhighlight lang="bash" inline>-d</syntaxhighlight> de la commande interne <syntaxhighlight lang="bash" inline>enable</syntaxhighlight>
* utiliser la commande interne <syntaxhighlight lang="bash" inline>enable</syntaxhighlight> pour activer les commandes internes de l'interpréteur désactivées
* indiquer l'option <syntaxhighlight lang="bash" inline>-p</syntaxhighlight> à la commande interne commande
* supprimer le mode restreint avec <syntaxhighlight lang="bash" inline>set +r</syntaxhighlight> ou <syntaxhighlight lang="bash" inline>set +o restricted</syntaxhighlight>
 
Ces restrictions sont mises en place après la lecture de tous les fichiers d’initialisation.
 
De fait, il est possible d'utiliser <syntaxhighlight lang="bash" inline>rbash</syntaxhighlight> comme shell de connexion pour un utilisateur donné (exemple pour <syntaxhighlight lang="bash" inline>/etc/passwd</syntaxhighlight>) :
 
<syntaxhighlight lang="csv">
www-data:x:33:33:www-data:/var/www:/usr/bin/rbash
</syntaxhighlight>


==Sources de la section==
==Sources de la section==
* http://linuxfr.org/users/postroutine/journaux/bash-et-les-raccourcis-claviers
* http://linuxfr.org/users/postroutine/journaux/bash-et-les-raccourcis-claviers
* https://askubuntu.com/questions/70750/how-to-get-bash-to-stop-escaping-during-tab-completion
* https://askubuntu.com/questions/70750/how-to-get-bash-to-stop-escaping-during-tab-completion
* https://bugzilla.redhat.com/show_bug.cgi?id=679696
* https://www.gnu.org/software/bash/manual/html_node/The-Restricted-Shell.html#The-Restricted-Shell

Dernière version du 2 mars 2022 à 11:04

Le shell Bash est l'interpréteur de commandes par défaut de la plupart des distributions Linux. Il peut être personnalisé en modifiant son apparence ou en lui activant des paramètres.

Configuration

bashrc

Le .bashrc est un fichier qui contient des commandes à exécuter au moment de la connexion d'un utilisateur. Il en existe 2 types :

  • Un générique pour tout les utilisateurs : /etc/bash.bashrc
  • Un local pour chaque utilisateurs en particulier : ~/.bashrc

Pour que les modifications prennent effet, il faut recharger le fichier après modification soit en relançant le shell, soit en exécutant le fichier comme s'il s’agissait d'une commande . .bashrc ou bien en utilisant la commande source ~/.bashrc.

Auto complétion

Le paquet bash-completion offre la possibilité de compléter les commandes bash à l'aide de la tabulation. Il faut entrer les quelques lignes suivantes dans l'un des fichiers de configuration de bash pour que cela prenne effet.

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

Personnalisation du prompt

inputrc

Insensibilité à la casse

Rendre insensible l'auto complétion du shell Bash à la casse (très utile quand on tape vite au clavier et que le système écrit /Etc au lieu de /etc et dit "Aucun fichier ou dossier de ce type").

vim ~/.inputrc

Ajouter cette ligne :

set completion-ignore-case On

Source de la section

http://askubuntu.com/questions/87061/can-i-make-tab-auto-completion-case-insensitive-in-the-terminal

Redirections

Rediriger plusieurs lignes

Pour ce faire nous utiliserons un EOF (End Of File). Il faut précéder et succéder une chaîne de caractère quelconque par des traits de soulignement afin de marquer le début et la fin de notre bloque de texte (à la manière du motd Cisco).

Dans un fichier

ycharbi@XPS13:/tmp$ cat << '_EOF_' > foo.txt
> Écrire et
> terminer par le
> même symbole
> _EOF_
ycharbi@XPS13:/tmp$ cat foo.txt 
Écrire et
terminer par le
même symbole

Dans le shell

ycharbi@XPS13:/tmp$ cat << _EOF_
> Écrire et
> terminer par le
> même symbole
> _EOF_
Écrire et
terminer par le
même symbole

ASTUCE

Le fait de mettre des quottes au mot clé de fin de fichier (_EOF_ dans l'exemple, mais pourrai être toto) permet de désactiver l'interprétation Bash. Si vous ne les mettez pas, le shell interprétera le code que vous entrerez (les variables notamment). À vous de voir ce que vous voulez faire. Ceci est expliqué dans ce chapitre du guide de programmation Bash avancé repris par ce commentaire.

Source de la section

Arguments

Voici une liste d'astuces pour récupérer des arguments tapés en bash:

Argument Signification
<Échap> + _ Colle le dernier argument passé à la dernière commande tapée
!$ Équivaut, au moment d'envoyer la commande, au dernier argument passé à la dernière commande tapée
!:$ Équivaut, au moment d'envoyer la commande, à l’énième argument passé à la dernière commande tapée (remplacer le $ par le numéro de l'argument)
!! Équivaut, au moment d'envoyer la commande, à tout les arguments de la dernière commande tapée
^toto^titi Permet de remplacer toto par titi dans la commande précédente (à entrer seul, sans commande ni argument). Un ls /etc suivi d'un ^/etc^/ donnera un ls /
~+ Donne le répertoire courant (est identique à $(pwd))
<ctrl> + alt + e Déroule la véritable signification d'un alias. Par exemple, si je tape ls suivi de ce raccourci clavier, j'obtiens ls --color qui est définit comme alias dans mon .bashrc
$_ Correspond au dernier paramètre de la dernière commande exécuté. La différence avec les motifs présentés plus haut est qu'il utilisable même lors d'un enchaînement de commande comme par exemple mkdir -p ~/tmp/conteneur && cd $_

Restriction

Il est possible de restreindre l'usage du shell pour un utilisateur en exécutant bash avec l'option -r ou en utilisant /usr/bin/rbash (résultat identique).

L'interpréteur ainsi restreint permet de créer un environnement plus contrôlé qu'un interpréteur standard. Il se comporte de même façon que bash à la différence des actions suivantes qui sont interdites ou non effectuées :

  • changer de répertoire avec cd
  • créer ou détruire les valeurs de SHELL, PATH, HISTFILE, ENV ou BASH_ENV
  • indiquer des noms de commandes contenant un /
  • indiquer un nom de fichier contenant un / comme argument de la commande interne .
  • indiquer un nom de fichier contenant une barre oblique (/) comme argument de la commande interne history
  • indiquer un nom de fichier contenant une barre oblique comme argument de l'option -p de la commande interne hash
  • importer une définition de fonction dans l'environnement au démarrage
  • analyser les valeurs de SHELLOPTS de l'environnement d'interpréteur au démarrage
  • rediriger la sortie en utilisant les opérateurs de redirection >, >|, <>, >&, &> et >>
  • utiliser la commande interne exec pour remplacer l'interpréteur par une autre commande
  • ajouter ou supprimer des commandes internes avec les options -f et -d de la commande interne enable
  • utiliser la commande interne enable pour activer les commandes internes de l'interpréteur désactivées
  • indiquer l'option -p à la commande interne commande
  • supprimer le mode restreint avec set +r ou set +o restricted

Ces restrictions sont mises en place après la lecture de tous les fichiers d’initialisation.

De fait, il est possible d'utiliser rbash comme shell de connexion pour un utilisateur donné (exemple pour /etc/passwd) :

www-data:x:33:33:www-data:/var/www:/usr/bin/rbash

Sources de la section