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
linux:memo_bash [17/10/2011 13:37] – Mise en forme daniellinux:memo_bash [10/09/2020 09:58] (Version actuelle) – [Memo BASH] 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/
 +  * https://www.shellcheck.net/
 +  * https://bash3boilerplate.sh/ 
 +  * https://devhints.io/bash
 +  * https://devdocs.io/bash/
 +
  
 ===== 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
  
 +  * http://www.tldp.org/LDP/abs/html/ioredirintro.html et http://www.tldp.org/LDP/abs/html/ioredirintro.html
 +  * http://wiki.bash-hackers.org/howto/redirection_tutorial#an_example pour un exemple instructif de file descriptors
 +  * 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)
 +
 +Attention, si on capture stdout avec un truc comme 
 +<code bash>
 +exec > >(while read line; do echo "[$(date '+%F %T')] $line" >> $LOGRAP; done)
 +</code>
 +le contenu du fichier $LOGRAP est pas immédiatement disponible dans le script principal (quand un sous-shell écrit dans un fichier, faut visiblement qu'il ait terminé pour que le parent soit sûr de récupérer le contenu.
  
 ==== 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 39:
 ==== 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 44: Ligne 63:
 $* 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). ''shift'' enlève $1 de la liste (ne le retourne pas, faut le mémoriser dans une variable avant si on en a besoin).
Ligne 51: Ligne 70:
  
 $! le n° PID du processus fils $! le n° PID du processus fils
- 
- 
- 
- 
- 
  
 ==== Manipulation de chaînes ==== ==== Manipulation de chaînes ====
Ligne 97: Ligne 111:
 </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 118: Ligne 135:
 5  => hello 5  => hello
 </code> </code>
- 
  
  
Ligne 126: Ligne 142:
  
   * Tester un fichier [ option fichier ]   * Tester un fichier [ option fichier ]
-  * -e il existe +  * -e il existe 
-  * -f c'est un fichier normal +  * -f c'est un fichier normal 
-  * -d c'est un répertoire +  * -d c'est un répertoire 
-  * -r | -w | -x il est lisible | modifiable | exécutable +  * -L : c'est un symlink 
-  * -s il n'est pas vide+  * -h : c'est un symlink valide (marche pour les dossiers) 
 +  * -r | -w | -x | -k | -p | -u : lisible | modifiable | exécutable | sticky | suid 
 +  * -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 [ option chaine ]   * Tester une 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 157: Ligne 180:
 [ ! -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 169: Ligne 210:
  
 ===== Commandes ===== ===== Commandes =====
 +Cf http://ss64.com/bash/ pour une liste de commandes bash et programmes gnu
  
 ==== vrac ==== ==== vrac ====
Ligne 197: Ligne 239:
 </file> </file>
  
-Pour RECOPIER UNE ARBORESCENCE (et son contenu) se placer dans le répertoire de destination et entrer 
-(cd /rep_a_copier ; tar cf - *) | tar xvf -  
-explication dans "le système Linux", p188 
-Apparemment devenu inutile depuis que cp a l'option -R. 
- 
-==== cat ==== 
-<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 
-  -e                       equivalent to -vE 
-  -E, --show-ends          display $ at end of each line 
-  -n, --number             number all output lines 
-  -s, --squeeze-blank      never more than one single blank line 
-  -t                       equivalent to -vT 
-  -T, --show-tabs          display TAB characters as ^I 
-  -u                       (ignored) 
-  -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> 
-==== tail ==== 
-<file> 
-Usage: tail [OPTION]... [FILE]... 
-Print the last 10 lines of each FILE to standard output. 
-With more than one FILE, precede each with a header giving the file name. 
-With no FILE, or when FILE is -, read standard input. 
- 
-      --retry              keep trying to open a file even if it is 
-                             inaccessible when tail starts or if it becomes 
-                             inaccessible later -- useful only with -f 
-  -c, --bytes=N            output the last N bytes 
-  -f, --follow[={name|descriptor}] output appended data as the file grows; 
-                             -f, --follow, and --follow=descriptor are 
-                             equivalent 
-  -n, --lines=N            output the last N lines, instead of the last 10 
-      --max-unchanged-stats=N 
-                           with --follow=name, reopen a FILE which has not 
-                             changed size after N (default 5) iterations 
-                             to see if it has been unlinked or renamed 
-                             (this is the usual case of rotated log files) 
-      --pid=PID            with -f, terminate after process ID, PID dies 
-  -q, --quiet, --silent    never output headers giving file names 
-  -s, --sleep-interval=S   with -f, each iteration lasts approximately S 
-                             (default 1) seconds 
-  -v, --verbose            always output headers giving file names 
-      --help               display this help and exit 
-      --version            output version information and exit 
- 
-If the first character of N (the number of bytes or lines) is a `+', 
-print beginning with the Nth item from the start of each file, otherwise, 
-print the last N items in the file.  N may have a multiplier suffix: 
-b for 512, k for 1024, m for 1048576 (1 Meg).  A first OPTION of -VALUE 
-or +VALUE is treated like -n VALUE or -n +VALUE unless VALUE has one of 
-the [bkm] suffix multipliers, in which case it is treated like -c VALUE 
-or -c +VALUE. 
- 
-With --follow (-f), tail defaults to following the file descriptor, which 
-means that even if a tail'ed file is renamed, tail will continue to track 
-its end.  This default behavior is not desirable when you really want to 
-track the actual name of the file, not the file descriptor (e.g., log 
-rotation).  Use --follow=name in that case.  That causes tail to track the 
-named file by reopening it periodically to see if it has been removed and 
-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> 
- 
-==== ls ==== 
--l format long 
--h human readable 
--S sort by file size 
--t sort by modification time 
--X sort alphabetically by entry extension 
-==== wc ==== 
- 
-wc -l donne le nb de lignes 
-par exemple 
-cat toto.txt | grep titi | wc -l 
-donne le nb de lignes où 'titi' apparait dans le fichier toto.txt 
-==== rm ==== 
- 
-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 cvzf archive.tgz repertoire_a_archiver 
-prends tous les fichiers de repertoire_a_archiver (sous-rep inclus) et les mets dans archive.tgz 
-tar xvzf archive.tgz decompresse l'archive (dans le rep courant) 
- 
-==== gzip ==== 
-<file> 
-usage: gzip [-cdfhlLnNrtvV19] [-S suffix] [file ...] 
- -c --stdout      write on standard output, keep original files unchanged 
- -d --decompress  decompress 
- -f --force       force overwrite of output file and compress links 
- -h --help        give this help 
- -l --list        list compressed file contents 
- -L --license     display software license 
- -n --no-name     do not save or restore the original name and time stamp 
- -N --name        save or restore the original name and time stamp 
- -q --quiet       suppress all warnings 
- -r --recursive   operate recursively on directories 
- -S .suf  --suffix .suf     use suffix .suf on compressed files 
- -t --test        test compressed file integrity 
- -v --verbose     verbose mode 
- -V --version     display version number 
- -1 --fast        compress faster 
- -9 --best        compress better 
- file...          files to (de)compress. If none given, use standard input. 
-</file> 
 ==== find ==== ==== find ====
  
-pour afficher tous les fichiers de + de 20Ko (FreeBSD, 20k autorise sous linux) +pour afficher tous les fichiers de + de 20Ko (FreeBSD, notation 20k autorisée 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 ==== +
-<file> +
-Usage: grep [OPTION]... PATRON [FICHIER] ... +
-Search for PATTERN in each FILE or standard input. +
-Example: grep -i 'hello world' menu.h main.c +
- +
-Regexp selection and interpretation: +
-  -E, --extended-regexp     PATRON est une expression regulière étendue +
-  -F, --fixed-regexp        PATRON est une chaîne fixe séparée par des retour de chariot +
-  -G, --basic-regexp        PATRON est une expression régulière de base +
-  -e, --regexp=PATTERN      utiliser le PATRON comme expression régulière +
-  -f, --file=FILE           obtenir le PATRON du FICHIER +
-  -i, --ignore-case         ignorer la distrinction de la casse +
-  -w, --word-regexp         forcer l'appariement du PATRON que sur des mots complets +
-  -x, --line-regexp         forcer l'appariement du PATRON que sur des lignes entières +
-  -z, --null-data           terminer la ligne de données par ZÉRO et +
-                            non pas par un retour de chariot +
- +
-Divers: +
-  -s, --no-messages         supprimer les messages d'erreur +
-  -v, --revert-match        sélectionner les lignes sans concordances +
-  -V, --version             afficher le nom et la version du logiciel +
-      --help                afficher l'aide et quitter +
-      --mmap                utiliser la table de mémoire à l'entrée si possible +
- +
-Output control: +
-  -b, --byte-offset         print the byte offset with output lines +
-  -n, --line-number         print line number with output lines +
-  -H, --with-filename       print the filename for each match +
-  -h, --no-filename         suppress the prefixing filename on output +
-  -q, --quiet, --silent     suppress all normal output +
-      --binary-files=TYPE   assume that binary files are TYPE +
-                            TYPE is 'binary', 'text', or 'without-match'+
-  -a, --text                equivalent to --binary-files=text +
-  -I                        equivalent to --binary-files=without-match +
-  -d, --directories=ACTION  how to handle directories +
-                            ACTION is 'read', 'recurse', or 'skip'+
-  -r, --recursive           equivalent to --directories=recurse. +
-  -L, --files-without-match only print FILE names containing no match +
-  -l, --files-with-matches  only print FILE names containing matches +
-  -c, --count               only print a count of matching lines per FILE +
-  -Z, --null                print 0 byte after FILE name +
- +
-Contrôle du contexte: +
-  -B, --before-context=N    imprimer N lignes du contexte d'en-tête +
-  -A, --after-context=N     imprimer N lignes du contexte finale +
-  -C, --context[=N]         imprimer N lignes (2 par défaut) du contexte +
-                            à moins que -A ou -B ne soit spécifié +
-  -N                        identique à --context=N +
-  -U, --binary              ne pas enlever les caractères CR sur +
-                            les fins de lignes (MS-DOS) +
-  -u, --unix-byte-offsets   afficher les adresses relatives comme si +
-                            aucun CR n'était présent (MS-DOS) +
- +
-`egrep' est équivalent à `grep -E'. `fgrep' est équivalent à `grep -F'. +
-Sans FICHIER, ou si - est utilisé comme nom de FICHIER, la lecture +
-se fait de l'entrée standard. S'il y a moins de 2 FICHIERS, l'option -h +
-est implicite. Termine avec 0 s'il y a concordance avec 1 si aucune. +
-Termine avec 2 s'il y a des erreurs de syntaxe ou de système. +
-</file>+
  
 ==== sed ==== ==== sed ====
  
 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 410: Ligne 271:
 <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 427: Ligne 288:
   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 (ici la ligne 288) 
-  sed -e '288 !d' </etc/apache/httpd.conf +  sed -e '288 !d' <fichier 
-affichera la ligne 288 (ou plutôt n'effacera pas, le "!d", la 288e ligne du fichier en entrée) +ou  
-et +  sed -ne '288 p
 + 
 +ou un bloc de lignes
   sed -e '288,291 !d' </etc/apache/httpd.conf   sed -e '288,291 !d' </etc/apache/httpd.conf
-affichera les lignes 288 à 291.+ou 
 +  sed -ne '288,291 p' </etc/apache/httpd.conf
  
 ==== cut ==== ==== cut ====
Ligne 442: Ligne 306:
 pour récupérer les GUIDuser du log nl3i pour récupérer les GUIDuser du log nl3i
 grep kne nl3i_access.log | grep 'GET /kne/index.php?GUIDUser' | cut -d' ' -f7 | cut -d= -f2 | cut -d'&' -f1 grep kne nl3i_access.log | grep 'GET /kne/index.php?GUIDUser' | cut -d' ' -f7 | cut -d= -f2 | cut -d'&' -f1
- 
-==== php ==== 
-<file> 
-sur ns2230, le binaire php est dans /usr/local/bin/php 
-Usage: php [-q] [-h] [-s] [-v] [-i] [-f <file>] 
-       php <file> [args...] 
-  -a               Run interactively 
-  -C               Do not chdir to the script's directory 
-  -c <path>|<file> Look for php.ini file in this directory 
-  -n               No php.ini file will be used 
-  -d foo[=bar]     Define INI entry foo with value 'bar' 
-  -e               Generate extended information for debugger/profiler 
-  -f <file>        Parse <file> Implies `-q' 
-  -h               This help 
-  -i               PHP information 
-  -l               Syntax check only (lint) 
-  -m               Show compiled in modules 
-  -q               Quiet-mode.  Suppress HTTP Header output. 
-  -s               Display colour syntax highlighted source. 
-  -v               Version number 
-  -w               Display source with stripped comments and whitespace. 
-  -z <file>        Load Zend extension <file>. 
-</file> 
  
 ==== mysql ==== ==== mysql ====
Ligne 473: Ligne 314:
  
 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=
  
 ex de backup & mail ex de backup & mail
 +
 <code bash> <code bash>
 #!/bin/sh #!/bin/sh
Ligne 500: Ligne 342:
 /usr/bin/uuencode $fichier_attache $nom_fichier| mail -s "$sujet" $envoyer_a; /usr/bin/uuencode $fichier_attache $nom_fichier| mail -s "$sujet" $envoyer_a;
 </code> </code>
 +
 +==== mail ====
  
 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.1318851465.txt.gz · Dernière modification : 17/10/2011 13:37 de daniel