Outils pour utilisateurs

Outils du site


linux:memo_bash

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
Prochaine révisionLes deux révisions suivantes
linux:memo_bash [30/04/2011 18:43] – regex => globing (shell) daniellinux:memo_bash [27/02/2014 16:59] daniel
Ligne 2: Ligne 2:
  
   * [[http://abs.traduc.org/abs-fr/index.html|Guide avancé d'écriture des scripts Bash]]   * [[http://abs.traduc.org/abs-fr/index.html|Guide avancé d'écriture des scripts Bash]]
 +  * http://www.davidpashley.com/articles/writing-robust-shell-scripts/
  
 ===== vrac ===== ===== vrac =====
 +
 +
  
 ==== Redirection ==== ==== Redirection ====
 Pour rediriger les erreurs dans le meme log : commande >log 2>&1 Pour rediriger les erreurs dans le meme log : commande >log 2>&1
  
 +Cf http://wiki.bash-hackers.org/howto/redirection_tutorial#an_example pour un exemple instructif de file descriptors
 +
 +Cf http://xensoft.com/content/use-exec-direct-all-bash-script-output-file-syslog-or-other-command pour capture de stdout|stderr dans un script
 +
 +Cf aussi 
 +  trap commande signal
 +pour exécuter une commande en cas de signal (le try/catch du bash)
  
 ==== gestion des processus liés au terminal (avant/arrière plan, attachés/détachés) ==== ==== gestion des processus liés au terminal (avant/arrière plan, attachés/détachés) ====
Ligne 19: Ligne 29:
 ==== jobs et at ==== ==== jobs et at ====
 On peut lister les jobs en cours avec ''jobs -p'', mais ça ne concernent pas les jobs en attente de at (du genre ''echo 'faire un truc' | at 14:42''), qui sont dans /var/spool/cron/atjobs/, mais que l'on peut lister avec ''atq'' ou virer avec ''atrm $numero_du_job''. On peut lister les jobs en cours avec ''jobs -p'', mais ça ne concernent pas les jobs en attente de at (du genre ''echo 'faire un truc' | at 14:42''), qui sont dans /var/spool/cron/atjobs/, mais que l'on peut lister avec ''atq'' ou virer avec ''atrm $numero_du_job''.
 +
 +
  
 ==== variables ==== ==== variables ====
Ligne 43: Ligne 55:
 $* La liste des arguments à partir de $1 $* La liste des arguments à partir de $1
  
-$@ La liste des arguments à partir de $1, chacun étant entre " (le nb et les contenu sont donc préservé si l'un deux comporte une espace, cf http://stefaanlippens.net/node/85)+$@ La liste des arguments à partir de $1, chacun étant entre " (le nb et les contenu sont donc préservé si l'un deux comporte une espace, cf http://stefaanlippens.net/node/85, donc en général ce sera du ''for arg in "$@"...'') 
 + 
 +''shift'' enlève $1 de la liste (ne le retourne pas, faut le mémoriser dans une variable avant si on en a besoin).
  
 $$ le n° PID du processus courant $$ le n° PID du processus courant
  
 $! le n° PID du processus fils $! le n° PID du processus fils
- 
- 
- 
- 
- 
  
 ==== Manipulation de chaînes ==== ==== Manipulation de chaînes ====
Ligne 94: Ligne 103:
 </code> </code>
  
-=== subsitution de variable ===+ 
 +==== substitution de variable ====
 bash ne permet pas l'écriture de $$var ou ${$var}. Pour contourner ce pb, utiliser les tableaux ${var[$indice]} (si $indice n'est pas numérique, il est converti en 0, on ne peut donc pas avoir de clés non numériques) bash ne permet pas l'écriture de $$var ou ${$var}. Pour contourner ce pb, utiliser les tableaux ${var[$indice]} (si $indice n'est pas numérique, il est converti en 0, on ne peut donc pas avoir de clés non numériques)
  
-=== tableaux ===+Mais pour des booléens on peut utiliser le test -v "$nomVar" pour savoir si elle a été définie ou pas (mais on peut pas récupérer sa valeur). 
 + 
 +==== tableaux ====
 Cf http://aral.iut-rodez.fr/fr/sanchis/enseignement/bash/ar01s12.html Cf http://aral.iut-rodez.fr/fr/sanchis/enseignement/bash/ar01s12.html
  
Ligne 121: Ligne 133:
 Source: http://www.ac-creteil.fr/reseaux/systemes/linux/shell-scripts/shell-programmation.html et http://abs.traduc.org/abs-fr/ch07s02.html Source: http://www.ac-creteil.fr/reseaux/systemes/linux/shell-scripts/shell-programmation.html et http://abs.traduc.org/abs-fr/ch07s02.html
  
-  * Tester un fichier +  * Tester un fichier [ option fichier ] 
-[ option fichier ] +  -e il existe 
-avec pour option +  -f c'est un fichier normal 
--e il existe +  -d c'est un répertoire 
--f c'est un fichier normal +  * -L : c'est un symlink 
--d c'est un répertoire +  * -h : c'est un symlink valide (marche pour les dossiers) 
--r | -w | -x il est lisible | modifiable | exécutable +  * -r | -w | -x | -k | -p | -u : lisible | modifiable | exécutable | sticky | suid 
--s il n'est pas vide+  * -p | -t | -S : tube nommé | file descriptor | socket 
 +  * -O | -G : il m' appartient | appartient à mon groupe 
 +  -s il n'est pas vide 
 +  * fichier_1 -ef fichier_2 : vrai si le fichier_1 et fichier_2 sont hard linkés (equal files) 
 +  * fichier_1 -nt fichier_2 : vrai si le fichier_1 est plus récent (newer than) que le fichier_2 ou si fichier_1 existe et non fichier_2
  
-  * Tester une chaine +  * Tester une chaine [ option chaine ] 
-[ option chaine ] +  -z | -n la chaine est vide / n'est pas vide 
--z | -n la chaine est vide / n'est pas vide +  = | != les chaines comparées sont identiques | différentes 
-= | != les chaines comparées sont identiques | différentes+  * -v variable : $variable existe et a été assignée
  
 ATTENTION à quoter la variable à tester : ATTENTION à quoter la variable à tester :
Ligne 156: Ligne 172:
 [ ! -f $1 -a $2 -lt 10 ] && echo "OK, le 1er param n'est pas un fichier et le 2e est inférieur à 10" [ ! -f $1 -a $2 -lt 10 ] && echo "OK, le 1er param n'est pas un fichier et le 2e est inférieur à 10"
  
-===== Commandes perso ===== 
  
 +==== ulimit ====
 +  * -S :soft limit
 +  * -H : hard limit
 +  * -a : tout afficher
 +  * -n : nb max de fichiers ouverts (socket & connexions comprises)
 +  * -u : nb max de process lancés
 +  * -T : nb max de threads
  
 +Cf man bash /ulimit pour le reste... (ou man dash, sous debian les process sont souvent lancés par dash, alias de sh, cf /etc/passwd)
  
 +Ces valeurs sont fixées dans /etc/security/limits.conf (par user/group), où dans certains fichiers de paramètres des script de démarrage (/etc/default/nginx par ex).
 +
 +Attention, ces valeurs s'héritent (par ex un "sudo -i -u toto ulimit -a" n'affiche pas forcément la même chose qu'un passthru("ulimit -a") exécuté par un pool php qui tourne sous le user toto, qui lui a hérité des valeurs du process php-fpm parent, cf /etc/default/php5-fpm)
 +
 +===== Commandes perso =====
 +
 +
 +  * Pour lister le nb de fichiers/dossiers par dossier du rep courant (cf http://serverfault.com/a/111860)
 +<code bash>ionice -c3 find | cut -d/ -f2 > /tmp/files.list
 +uniq -c < /tmp/files.list | sort -n</code>
  
 ==== Scripts ==== ==== Scripts ====
 +
 === afflign.sh - afficher une (ou des) lignes d'un fichier === === afflign.sh - afficher une (ou des) lignes d'un fichier ===
  
Ligne 203: Ligne 237:
 ==== cat ==== ==== cat ====
 <file> <file>
-Usage: cat [OPTION] [FILE]... 
-Concatenate FILE(s), or standard input, to standard output. 
- 
-  -A, --show-all           equivalent to -vET 
   -b, --number-nonblank    number nonblank output lines   -b, --number-nonblank    number nonblank output lines
-  -e                       equivalent to -vE 
   -E, --show-ends          display $ at end of each line   -E, --show-ends          display $ at end of each line
   -n, --number             number all output lines   -n, --number             number all output lines
   -s, --squeeze-blank      never more than one single blank line   -s, --squeeze-blank      never more than one single blank line
-  -t                       equivalent to -vT 
   -T, --show-tabs          display TAB characters as ^I   -T, --show-tabs          display TAB characters as ^I
-  -u                       (ignored) 
   -v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB   -v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB
-      --help               display this help and exit 
-      --version            output version information and exit 
- 
-With no FILE, or when FILE is -, read standard input. 
 </file> </file>
 ==== tail ==== ==== tail ====
Ligne 264: Ligne 287:
 named file by reopening it periodically to see if it has been removed and named file by reopening it periodically to see if it has been removed and
 recreated by some other program. recreated by some other program.
-</file> 
-==== chmod ==== 
-<file> 
-les droits sous UNIX 
-4 == READ (r) 
-2 == WRITE (w) 
-1 == EXECUTE (x) 
-ie 700=rwx------ ou bien 644=rw-r--r-- 
 </file> </file>
  
 ==== ls ==== ==== ls ====
 +<file>
 -l format long -l format long
 -h human readable -h human readable
Ligne 280: Ligne 296:
 -t sort by modification time -t sort by modification time
 -X sort alphabetically by entry extension -X sort alphabetically by entry extension
 +</file>
 +
 ==== wc ==== ==== wc ====
 +"word count"
  
-wc -l donne le nb de lignes +  wc -l donne le nb de lignes 
-par exemple + 
-cat toto.txt | grep titi | wc -l +  cat toto.txt | grep titi | wc -l 
-donne le nb de lignes où 'titi' apparait dans le fichier toto.txt +donne le nb de lignes où 'titi' apparait dans le fichier toto.txt, mais vaut mieux le faire avec 
-==== rm ====+  grep -c titi toto.txt
  
-Pour virer un rep entier 
-rm -Rf repertoire_a_vider 
-si marche pas : rm -Rf repertoire_a_vider/* (elever a la main les fichiers cachés éventuels) puis rmdir repertoire_a_vider 
 ==== tar ==== ==== tar ====
  
-tar cvzf archive.tgz repertoire_a_archiver +  tar cvzf archive.tgz repertoire_a_archiver 
-prends tous les fichiers de repertoire_a_archiver (sous-rep inclus) et les mets dans archive.tgz +prends tous les fichiers de repertoire_a_archiver (sous-rep inclus) et les mets dans archive.tgz, idem en bzip2 avec 
-tar xvzf archive.tgz decompresse l'archive (dans le rep courant)+  tar cvjf archive.tar.bz2 repertoire_a_archiver 
 + 
 +  tar xvzf archive.tgz decompresse l'archive (dans le rep courant) 
 +et en général 
 +  tar xvf archive.tgz 
 +suffit
  
 ==== gzip ==== ==== gzip ====
Ligne 321: Ligne 342:
  
 pour afficher tous les fichiers de + de 20Ko (FreeBSD, 20k autorise sous linux) pour afficher tous les fichiers de + de 20Ko (FreeBSD, 20k autorise sous linux)
-find /path \( -size +20000c \) -exec ls -l {} \;+  find /path \( -size +20000c \) -exec ls -l {} \;
 lister les fichier de /tmp de 0 octets de + de 60mn lister les fichier de /tmp de 0 octets de + de 60mn
-find /tmp -size 0 -amin -60 -exec ls -alh {} \;+  find /tmp -size 0 -mmin +60 -exec ls -alh {} \;
  
 pour renommer les mp3 en swf pour renommer les mp3 en swf
-for i in *.mp3; do mv $i ${i%mp3}swf ;done+  for i in *.mp3; do mv $i ${i%mp3}swf ;done
  
 ==== grep ==== ==== grep ====
Ligne 392: Ligne 413:
  
 fait du rechercher/remplacer sur des streams (avec regexp) : sed 'action/rech/rempl/opt fait du rechercher/remplacer sur des streams (avec regexp) : sed 'action/rech/rempl/opt
 +
 +cf [[sed]]
  
 exemples sur http://iml.univ-mrs.fr/~bac/DESS/sed.html exemples sur http://iml.univ-mrs.fr/~bac/DESS/sed.html
Ligne 409: Ligne 432:
 <file> <file>
 Début de ligne ^ Début de ligne ^
-Fin de ligne $+Fin de ligne         $
 N'importe quel caractère . N'importe quel caractère .
 Zéro ou plusieurs * Zéro ou plusieurs *
Ligne 426: Ligne 449:
   for fich in *.hosts; do digovh.sh `echo $fich | sed 's/.hosts//g'` | grep ko; done   for fich in *.hosts; do digovh.sh `echo $fich | sed 's/.hosts//g'` | grep ko; done
  
-Voir aussi tr qui remplace des bouts de chaine (sans regexp).+Voir aussi tr qui remplace des caractères (sans regexp, lire le man pour les pbs avec l'utf8).
  
 sed est aussi efficace pour afficher une ligne particulière sed est aussi efficace pour afficher une ligne particulière
Ligne 433: Ligne 456:
 et  et 
   sed -e '288,291 !d' </etc/apache/httpd.conf   sed -e '288,291 !d' </etc/apache/httpd.conf
-affichera les lignes 288 à 291.+affichera les lignes 288 à 291, tout comme 
 +  sed -ne '288,291 p' </etc/apache/httpd.conf 
 +(on affiche pas sauf demande explicite)
  
 ==== cut ==== ==== cut ====
Ligne 472: Ligne 497:
  
 Quand on a perdu le mot de pase root: Quand on a perdu le mot de pase root:
-<file>+<code bash>
 /etc/rc.d/init.d/mysql stop /etc/rc.d/init.d/mysql stop
-Restart it with the following:+Restart it with the following:
 /usr/bin/safe_mysqld --skip-grant-tables --skip-networking & /usr/bin/safe_mysqld --skip-grant-tables --skip-networking &
-Connect to the server with:+Connect to the server with:
 mysql mysql mysql mysql
-Enter the following:+Enter the following:
 UPDATE user SET password=PASSWORD('the_new_password') WHERE User="root" AND Host="localhost";  UPDATE user SET password=PASSWORD('the_new_password') WHERE User="root" AND Host="localhost"; 
-Exit the client +Exit the client 
-Shut down the server with:+Shut down the server with:
 mysqladmin shutdown mysqladmin shutdown
-Start the server back up properly with:+Start the server back up properly with:
 /etc/rc.d/init.d/mysql start /etc/rc.d/init.d/mysql start
-</file>+</code>
 trouvé sur http://cobalt-knowledge.sun.com/cgi-bin/kbase.cfg/php/enduser/std_adp.php?p_sid=YjolZNgg&p_lva=&p_refno=011220-000002&p_created=1008866547&p_sp=cF9ncmlkc29ydD0mcF9yb3dfY250PTk5OSZwX3BhZ2U9MQ**&p_li= trouvé sur http://cobalt-knowledge.sun.com/cgi-bin/kbase.cfg/php/enduser/std_adp.php?p_sid=YjolZNgg&p_lva=&p_refno=011220-000002&p_created=1008866547&p_sp=cF9ncmlkc29ydD0mcF9yb3dfY250PTk5OSZwX3BhZ2U9MQ**&p_li=
  
Ligne 501: Ligne 526:
  
 un simple un simple
- cat fichier_a_joindre | uuencode nom_de_la_piece_jointe | mail -s "sujet" webmaster@editionsdidier.com + cat fichier_a_joindre | uuencode nom_de_la_piece_jointe | mail -s "sujet" dest@domaine.tld
 marche aussi, équivalent à marche aussi, équivalent à
-uuencode fichier_a_joindre nom_de_la_piece_jointe | mail -s "sujet" webmaster@editionsdidier.com +  uuencode fichier_a_joindre nom_de_la_piece_jointe | mail -s "sujet" dest@domaine.tld 
  
 ===== NFS ===== ===== NFS =====
linux/memo_bash.txt · Dernière modification : 10/09/2020 09:58 de daniel