Différences entre les versions de « Bash & Shell »

De BlaxWiki
Aller à la navigationAller à la recherche
 
(36 versions intermédiaires par 3 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
[[https://wiki.blaxeenprod.com/BENPERSO/doc-manuel/system/shell-quoting-guide.htm Doc très interessante en anglais sur les quote en shell]]
Voila des docs complètes pour la programmation en bash :


[[http://www.commentcamarche.net/faq/sujet-4801-guide-d-utilisation-du-shell-pour-debutant Doc Général pour débutant en shell]]
[https://{{SERVERNAME}}/BENPERSO/doc-manuel/system/linux/Bash-Guide-Avancee-5.3-FR.pdf Guide avancé d'écriture des scripts Bash(fr)]  (pris de http://abs.traduc.org/abs-fr/index.html)


Dans les  
[https://{{SERVERNAME}}/BENPERSO/doc-manuel/system/linux/Bash_guide_debutant-FR.pdf Guide bash du débutant(fr)]
 
[https://{{SERVERNAME}}/BENPERSO/doc-manuel/system/linux/Intro_programmation_bash-FR.pdf Introduction à la programmation en Bash(fr)] (pris de http://ftp-developpez.com/eric-sanchis/IntroProgBash.pdf)
 
[https://{{SERVERNAME}}/BENPERSO/doc-manuel/system/linux/shell-quoting-guide.htm Doc très interessante en anglais sur les quote en shell]
 
Voir aussi https://{{SERVERNAME}}/index.php/Cours_linux
 
[http://www.commentcamarche.net/faq/sujet-4801-guide-d-utilisation-du-shell-pour-debutant Doc Général pour débutant en shell]
 
Voir aussi tout ce qui concerne les [https://{{SERVERNAME}}/BENPERSO/doc-manuel/system/linux/terminal-HOWTO-fr.html terminaux] (tiré de http://fr.tldp.org/HOWTO/lecture/Text-Terminal-HOWTO.html)
 
* Commandes diverses
<pre>
for i in /appli/projects/*/tomcat_8.5.4/logs/localhost_access_log.2018-01-31.txt; do cp $i /localhost_access_log/$(basename $i)-$(echo $i | cut -d'/' -f4); done
</pre>
 
* Passage de paramètre sur l'entrée standard
<pre>
Pour automatiser des commandes, il peut etre nécessaire de faire passer des variables aux questions poser par les commandes.
Exemples : echo "y" | yum install strace
On peut ajouter un \n dans le echo si il y a besoin de faire un retour charriot
 
Dans certain cas la commande passée après le "|" s'execute dans une sorte d'autre session/shell, ce qui fait que l'echo n'est pas envoyé vers la commande. Le process est alors ataché
a une console sur laquel on peu lire mais pas ecrire, pour faire une ecriture il faut créer une console virtuel comme fait ssh par exemple (donc sur un ps, les tty et pts/0....n)
 
Il faut utiliser setsid :
echo | setsid php go-pear.phar
 
Rediriger la sortie standard et d'erreur vers un fichier :  commande > /var/log/nomdufichier.txt 2>&1
 
</pre>
 
* Ordre de lecture et d'interprétation.
Il faut savoir que le shell lit plusieurs fois la ligne avant d'exécuter la commande. Cette lecture se fait dans l'ordre suivant :
<pre>
1. substition de variables : le shell remplace les variables par leurs valeurs
2. substitution de commandes : le shell remplace une variable par son contenu qui est le résultat d'une commande
3. interprétation des pipes et des redirections
4. expansion des noms de fichiers : interprétation des caractères spéciaux pour compléter un nom de fichier et/ou de répertoire
5. exécution de la commande
</pre>
 
* Dans un script shell ou dans une console :
<pre>
$? C'est la valeur de sortie de la dernière commande. Elle vaut 0 si la commande s'est déroulée sans pb.
$0 Cette variable contient le nom du script
$1-$9 Les (éventuels) premiers arguments passés à l'appel du script
$# Le nombre d'arguments passés au script
$* ou $@ La liste des arguments à partir de $1
$$ le n° PID du processus courant
$! le n° PID du processus fils
</pre>
 
<pre>
( cmde ) exécute la commande dans un sous-shell
read a         lecture d'une entrée pendant l'exécution d'un script
exit num renvoie le status de la commande (en général 0 la commande s'est bien exécutée)
return num code d'erreur
. script exécution du script dans le shell courant
eval arg interprète arg avant de l'exécuter
cmd1 && cmd2 séparateur conditionnel (cmd2 sera exécuté si cmd1 s'est exécuté correctement)
cmd1 || cmd2 séparateur conditionnel (cmd2 sera exécuté si cmd1 ne s'est pas exécuté correctement)
nom_fonction ()
{ liste_commandes ;} définition d'une fonction
exec arg exécute la commande dans un nouveau shell
set var initialisation d'une variable
set -x          On peut avoir un debug dans un shell en faisant un set -x, pour enlever le debug set +x. Il existe d'autres options, voir le man set
unset var raz d'une variable
type cmde indique la localisation d'une commande
readonly var empêche la modification d'une variable
 
sci[ea]nce      le contenu des crochets représente un OU logique (sont représentées science et sciance)
[0-9]          équivaut à tous les chiffres de 0 à 9, le "-" entre des crochets signifie un intervale
epsilon[0-9A-Z] spécifie que epsilon peut être suivi d'un chiffre entre 0 et 9 ou d'une lettre majuscule
[^eo]          le ^ entre crochet définit ni « e » ni « o », il signifie la négation. Les expressions entre crochets ne permettent pas de décrire une chaîne de caractères, elles
                ne correspondent qu'à un seul caractère.Pour décrire une chaîne, il faut utiliser les parenthèses, lesquelles constituent une sous-expression régulière. Le tube |
                indique alors les alternatives. lou(p|ch)er décrit aussi bien louper que loucher.
 
 
</pre>
 
* Les expressions
<pre>
expr exp op exp exécute des opérations arithmétiques (op vaut : + , - , \* , / , % , = , \> , \< , \> = , \< = , !=)
expr exp1 \| exp2 renvoie exp1 si l'expression n'est pas nulle, sinon exp2
expr exp1 \& exp2 renvoie exp1 si l'expression n'est pas nulle, sinon exp2
expr exp1 : exp2 comparaison des deux arguments (renvoie le nombre de caractères en commun)
expr length exp retourne le nombre de caractères de exp
expr substr exp n1 n2 retourne une sous chaîne de exp commençant a la place n1 et de n2 caractères
expr index exp car retourne la position du caractère car dans la chaîne exp
</pre>
 
* Classe de caractères Posix pour egrep
<pre>
    [[:alnum:]] tout caractère alphanumérique
    [[:alpha:]] tout caractère alphabétique
    [[:digit:]] tout caractère numérique
    [[:blank:]] tabulations et espaces
    [[:lower:]] tout caractère alphabétique en minuscule
    [[:upper:]] tout caractère alphabétique en majuscule
    [[:cntrl:]] tout caractère ASCII de 000 à 037, et 177 octal
    [[:graph:]] tout caractère [[:alnum:]] et [[:punct:]]
    [[:punct:]] tout caractère de ponctuation ` ! ' # $ % ' ( ) * + - . / : ; < = > ? @ [ \ ] ^ _ { | } ~
    [[:space:]] tabulation, nouvelle ligne, tabulation verticale , nouvelle page, retour charriot, et espace
    [[:xdigit:]] tout caractère admis dans un chiffre hexadécimal (0 à 9, a à f, A à F).
</pre>
* Utilisation des quotes
<pre>
\c            banalise le caractère c
`cmd`          substitution de commande
"whatever"    banalise tous les caractères sauf $ ` \
'whatever'    banalise tous les caractères
 
Example:
  match=`ls *.bak`        #Puts names of .bak files into shell variable match.
  echo \*                #Echos * to screen, not all filename as in:  echo *
  echo '$1$2hello'        #Writes literally $1$2hello on screen.
  echo "$1$2hello"        #Writes value of parameters 1 and 2 and string hello.
</pre>
 
* Dans les man pages ou les aides :
<pre>
<pre>
- Tout texte isolé, sans [] (crochet), {} (accolade), <> (chevron), est à taper tel qu'il apparaît
- Tout texte isolé, sans [] (crochet), {} (accolade), <> (chevron), est à taper tel qu'il apparaît
Ligne 15 : Ligne 137 :
</pre>
</pre>


* Raccourcis clavier
<pre>
<pre>
$? C'est la valeur de sortie de la dernière commande.
    TAB : auto-complète un mot à partir de la position du curseur.
Elle vaut 0 si la commande s'est déroulée sans pb.
    CTRL + a : déplace le curseur en début de ligne (équivalent à la touche début).
$0 Cette variable contient le nom du script
    CTRL + c : envoie le signal SIGINT à la tâche au premier plan, ce qui a pour effet de l'interrompre.
$1 à $9 Les (éventuels) premiers arguments passés à l'appel du script
    CTRL + d : ferme le shell courant (équivalent de la commande exit).
$# Le nombre d'arguments passés au script
    CTRL + e : (end) déplace le curseur en fin de ligne (équivalent à la touche fin).
$* La liste des arguments à partir de $1
    CTRL + p : (previous) rappelle la commande précédente (équivalent à la touche flèche du haut).
$$ le n° PID du processus courant
    CTRL + n : (next) rappelle la commande suivante (équivalent à la touche flèche du bas).
$! le n° PID du processus fils
    CTRL + r : (research) rappelle la dernière commande contenant les caractères spécifiés (équivalent à vim ~/.bash_history). Un 2e CTRL + r rappelle la prochaine commande
antérieure correspondant à la recherche. CTRL + s : rappelle la commande suivante de la recherche (attention à ne pas l'exécuter depuis un terminal car cette commande déclencherait
son XOFF). CTRL + o : exécute la commande trouvée dans la recherche.
    CTRL + l : efface le contenu de l'écran (équivalent à la commande clear).
    CTRL + u : efface le contenu de la ligne avant le curseur et le place dans le presse-papier.
    CTRL + k : efface le contenu de la ligne après le curseur et le place dans le presse-papier.
    CTRL + w : efface le mot avant le curseur et le place dans le presse papier.
    CTRL + y : (yank) ajoute le contenu du presse-papier à partir de la position du curseur.
    CTRL + z : envoie le signal SIGTSTP à la tâche au premier plan ce qui a pour effet de la suspendre. Pour la réafficher on peut entrer fg 'nom du processus'.
    CTRL + x CTRL + x : (car x est en forme de croisement) alterne le curseur avec son ancienne position.
    CTRL + x CTRL + e : (editor car reprend la variable $EDITOR du shell) édite la ligne courante dans votre éditeur de texte.
    CTRL + 5 : correspond au code de sortie dans un telnet ou une commande qui ne repond pas ^]
    ALT + f : (forward) avance le curseur d'un mot.
    ALT + b : (backward) recule le curseur d'un mot.
    ALT + del : coupe le mot avant le curseur.
    ALT + d : couper le mot après le curseur.
    ALT + u : transforme le mot courant en majuscules à partir du curseur et avance d'un mot.
    ALT + l : transforme le mot courant en minuscules à partir du curseur et avance d'un mot.
    ALT + c : met la lettre sous le curseur en majuscule et avance d'un mot.
    ALT + r : annule les changements et remet la ligne telle qu'elle était dans l'historique.
</pre>
</pre>


[[Catégorie:Linux]]
[[Catégorie:Linux]]

Version actuelle datée du 6 février 2018 à 14:28

Voila des docs complètes pour la programmation en bash :

Guide avancé d'écriture des scripts Bash(fr) (pris de http://abs.traduc.org/abs-fr/index.html)

Guide bash du débutant(fr)

Introduction à la programmation en Bash(fr) (pris de http://ftp-developpez.com/eric-sanchis/IntroProgBash.pdf)

Doc très interessante en anglais sur les quote en shell

Voir aussi https://wiki.blaxeen.com/index.php/Cours_linux

Doc Général pour débutant en shell

Voir aussi tout ce qui concerne les terminaux (tiré de http://fr.tldp.org/HOWTO/lecture/Text-Terminal-HOWTO.html)

  • Commandes diverses
for i in /appli/projects/*/tomcat_8.5.4/logs/localhost_access_log.2018-01-31.txt; do cp $i /localhost_access_log/$(basename $i)-$(echo $i | cut -d'/' -f4); done 
  • Passage de paramètre sur l'entrée standard
Pour automatiser des commandes, il peut etre nécessaire de faire passer des variables aux questions poser par les commandes.
Exemples : echo "y" | yum install strace
On peut ajouter un \n dans le echo si il y a besoin de faire un retour charriot

Dans certain cas la commande passée après le "|" s'execute dans une sorte d'autre session/shell, ce qui fait que l'echo n'est pas envoyé vers la commande. Le process est alors ataché 
a une console sur laquel on peu lire mais pas ecrire, pour faire une ecriture il faut créer une console virtuel comme fait ssh par exemple (donc sur un ps, les tty et pts/0....n)

Il faut utiliser setsid :
echo | setsid php go-pear.phar

Rediriger la sortie standard et d'erreur vers un fichier :  commande > /var/log/nomdufichier.txt 2>&1

  • Ordre de lecture et d'interprétation.

Il faut savoir que le shell lit plusieurs fois la ligne avant d'exécuter la commande. Cette lecture se fait dans l'ordre suivant :

 1. substition de variables : le shell remplace les variables par leurs valeurs
 2. substitution de commandes : le shell remplace une variable par son contenu qui est le résultat d'une commande
 3. interprétation des pipes et des redirections
 4. expansion des noms de fichiers : interprétation des caractères spéciaux pour compléter un nom de fichier et/ou de répertoire
 5. exécution de la commande 
  • Dans un script shell ou dans une console :
 $? 	C'est la valeur de sortie de la dernière commande. Elle vaut 0 si la commande s'est déroulée sans pb.
 $0 	Cette variable contient le nom du script
 $1-$9 	Les (éventuels) premiers arguments passés à l'appel du script
 $# 	Le nombre d'arguments passés au script 
 $* ou $@ La liste des arguments à partir de $1
 $$ 	le n° PID du processus courant
 $! 	le n° PID du processus fils
( cmde ) 	exécute la commande dans un sous-shell
read a 	        lecture d'une entrée pendant l'exécution d'un script
exit num 	renvoie le status de la commande (en général 0 la commande s'est bien exécutée)
return num 	code d'erreur
. script 	exécution du script dans le shell courant
eval arg 	interprète arg avant de l'exécuter
cmd1 && cmd2 	séparateur conditionnel (cmd2 sera exécuté si cmd1 s'est exécuté correctement)
cmd1 || cmd2 	séparateur conditionnel (cmd2 sera exécuté si cmd1 ne s'est pas exécuté correctement)
nom_fonction ()
{ liste_commandes ;} 	définition d'une fonction
exec arg 	exécute la commande dans un nouveau shell
set var 	initialisation d'une variable
set -x          On peut avoir un debug dans un shell en faisant un set -x, pour enlever le debug set +x. Il existe d'autres options, voir le man set
unset var 	raz d'une variable
type cmde 	indique la localisation d'une commande
readonly var 	empêche la modification d'une variable

sci[ea]nce      le contenu des crochets représente un OU logique (sont représentées science et sciance)
[0-9]           équivaut à tous les chiffres de 0 à 9, le "-" entre des crochets signifie un intervale
epsilon[0-9A-Z] spécifie que epsilon peut être suivi d'un chiffre entre 0 et 9 ou d'une lettre majuscule
[^eo]           le ^ entre crochet définit ni « e » ni « o », il signifie la négation. Les expressions entre crochets ne permettent pas de décrire une chaîne de caractères, elles 
                ne correspondent qu'à un seul caractère.Pour décrire une chaîne, il faut utiliser les parenthèses, lesquelles constituent une sous-expression régulière. Le tube | 
                indique alors les alternatives. lou(p|ch)er décrit aussi bien louper que loucher.


  • Les expressions
expr exp op exp 	exécute des opérations arithmétiques (op vaut : + , - , \* , / , % , = , \> , \< , \> = , \< = , !=)
expr exp1 \| exp2 	renvoie exp1 si l'expression n'est pas nulle, sinon exp2
expr exp1 \& exp2 	renvoie exp1 si l'expression n'est pas nulle, sinon exp2
expr exp1 : exp2 	comparaison des deux arguments (renvoie le nombre de caractères en commun)
expr length exp 	retourne le nombre de caractères de exp
expr substr exp n1 n2 	retourne une sous chaîne de exp commençant a la place n1 et de n2 caractères
expr index exp car 	retourne la position du caractère car dans la chaîne exp 
  • Classe de caractères Posix pour egrep
    [[:alnum:]] tout caractère alphanumérique
    [[:alpha:]] tout caractère alphabétique
    [[:digit:]] tout caractère numérique
    [[:blank:]] tabulations et espaces
    [[:lower:]] tout caractère alphabétique en minuscule
    [[:upper:]] tout caractère alphabétique en majuscule
    [[:cntrl:]] tout caractère ASCII de 000 à 037, et 177 octal
    [[:graph:]] tout caractère [[:alnum:]] et [[:punct:]]
    [[:punct:]] tout caractère de ponctuation ` ! ' # $ % ' ( ) * + - . / : ; < = > ? @ [ \ ] ^ _ { | } ~
    [[:space:]] tabulation, nouvelle ligne, tabulation verticale , nouvelle page, retour charriot, et espace
    [[:xdigit:]] tout caractère admis dans un chiffre hexadécimal (0 à 9, a à f, A à F).
  • Utilisation des quotes
\c             banalise le caractère c
`cmd`          substitution de commande 
"whatever"     banalise tous les caractères sauf $ ` \
'whatever'     banalise tous les caractères

Example:
  match=`ls *.bak`        #Puts names of .bak files into shell variable match.
  echo \*                 #Echos * to screen, not all filename as in:  echo *
  echo '$1$2hello'        #Writes literally $1$2hello on screen.
  echo "$1$2hello"        #Writes value of parameters 1 and 2 and string hello.
  • Dans les man pages ou les aides :
- Tout texte isolé, sans [] (crochet), {} (accolade), <> (chevron), est à taper tel qu'il apparaît
- le texte entre crochets [] est facultatif
- le texte entre accolades {} contient les choix à faire.
- les choix sont séparées par | (pipe) ou par une virgule , commande -{a|b} veut dire commande -a ou commande -b mais pas commande -ab
- le texte entre chevrons <> doit être remplacé par le texte approprié
- les parenthèses (...), utilisées pour les paramètres tels que les noms de fichiers
- les crochets [] et les chevrons <> peuvent être combinés   [<nom_fichier>] - facultatif mais si vous les utilisez alors il faut écrire le nom du fichier
- les crochets [] et les accolades {} peuvent être combinés   [--option={a|b|c}]
  • Raccourcis clavier
    TAB : auto-complète un mot à partir de la position du curseur.
    CTRL + a : déplace le curseur en début de ligne (équivalent à la touche début).
    CTRL + c : envoie le signal SIGINT à la tâche au premier plan, ce qui a pour effet de l'interrompre.
    CTRL + d : ferme le shell courant (équivalent de la commande exit).
    CTRL + e : (end) déplace le curseur en fin de ligne (équivalent à la touche fin).
    CTRL + p : (previous) rappelle la commande précédente (équivalent à la touche flèche du haut).
    CTRL + n : (next) rappelle la commande suivante (équivalent à la touche flèche du bas).
    CTRL + r : (research) rappelle la dernière commande contenant les caractères spécifiés (équivalent à vim ~/.bash_history). Un 2e CTRL + r rappelle la prochaine commande 
antérieure correspondant à la recherche. CTRL + s : rappelle la commande suivante de la recherche (attention à ne pas l'exécuter depuis un terminal car cette commande déclencherait 
son XOFF). CTRL + o : exécute la commande trouvée dans la recherche.
    CTRL + l : efface le contenu de l'écran (équivalent à la commande clear).
    CTRL + u : efface le contenu de la ligne avant le curseur et le place dans le presse-papier.
    CTRL + k : efface le contenu de la ligne après le curseur et le place dans le presse-papier.
    CTRL + w : efface le mot avant le curseur et le place dans le presse papier.
    CTRL + y : (yank) ajoute le contenu du presse-papier à partir de la position du curseur.
    CTRL + z : envoie le signal SIGTSTP à la tâche au premier plan ce qui a pour effet de la suspendre. Pour la réafficher on peut entrer fg 'nom du processus'.
    CTRL + x CTRL + x : (car x est en forme de croisement) alterne le curseur avec son ancienne position.
    CTRL + x CTRL + e : (editor car reprend la variable $EDITOR du shell) édite la ligne courante dans votre éditeur de texte.
    CTRL + 5 : correspond au code de sortie dans un telnet ou une commande qui ne repond pas ^]
    ALT + f : (forward) avance le curseur d'un mot.
    ALT + b : (backward) recule le curseur d'un mot.
    ALT + del : coupe le mot avant le curseur.
    ALT + d : couper le mot après le curseur.
    ALT + u : transforme le mot courant en majuscules à partir du curseur et avance d'un mot.
    ALT + l : transforme le mot courant en minuscules à partir du curseur et avance d'un mot.
    ALT + c : met la lettre sous le curseur en majuscule et avance d'un mot.
    ALT + r : annule les changements et remet la ligne telle qu'elle était dans l'historique.