Différences

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

Lien vers cette vue comparative

Prochaine révision
Révision précédente
elearning:workbooks:redhat:rh124:l104 [2024/09/25 07:58] – created adminelearning:workbooks:redhat:rh124:l104 [2024/09/30 13:53] (Version actuelle) admin
Ligne 5: Ligne 5:
 Dernière mise-à-jour : ~~LASTMOD~~ Dernière mise-à-jour : ~~LASTMOD~~
  
-====== LCF405 - La Ligne de Commande======+====== RH12405 - La Ligne de Commande======
  
 =====Contenu du Module===== =====Contenu du Module=====
  
-  * **LCF405 - La Ligne de Commande**+  * **RH12405 - La Ligne de Commande**
     * Contenu du Module     * Contenu du Module
     * Le Shell     * Le Shell
Ligne 45: Ligne 45:
         * noglob         * noglob
         * nounset         * nounset
-    * LAB #2 - Les Scripts Shell 
-      * 2.1 - Exécution 
-      * 2.2 - La commande read 
-        * Code de retour 
-        * La variable IFS 
-      * 2.3 - La commande test 
-        * Tests de Fichiers 
-        * Tests de chaînes de caractère 
-        * Tests sur des nombres 
-        * Les opérateurs 
-        * Tests d'environnement utilisateur 
-      * 2.4 - La commande %%[[ expression ]]%% 
-      * 2.5 - Opérateurs du shell 
-      * 2.6 - L'arithmétique 
-        * La commande expr 
-          * Opérateurs Arithmétiques 
-          * Opérateurs de Comparaison 
-          * Opérateurs Logiques 
-        * La commande let 
-          * Opérateurs Arithmétiques 
-          * Opérateurs de comparaison 
-          * Opérateurs Logiques 
-          * Opérateurs travaillant sur les bits 
-      * 2.7 - Structures de contrôle 
-        * If 
-        * case 
-          * Exemple 
-        * Boucles 
-          * for 
-          * while 
-          * Exemple 
-      * 2.8 - Scripts de Démarrage 
-        * ~/.bash_profile 
-        * ~/.bashrc 
  
 =====Le Shell===== =====Le Shell=====
Ligne 88: Ligne 54:
 ^ Shell ^ Nom ^ Date de Sortie ^ Inventeur ^ Commande ^ Commentaires ^ ^ Shell ^ Nom ^ Date de Sortie ^ Inventeur ^ Commande ^ Commentaires ^
 | tsh | Thompson Shell | 1971 | Ken Thompson | sh | Le premier shell | | tsh | Thompson Shell | 1971 | Ken Thompson | sh | Le premier shell |
-| sh | Bourne Shell | 1977 | Stephen Bourne | sh | Le shell commun à tous les Unix. Sous RHEL/CentOS 8 : /usr/bin/sh | +| sh | Bourne Shell | 1977 | Stephen Bourne | sh | Le shell commun à tous les Unix. Sous RHEL : /usr/bin/sh | 
-| csh | C-Shell | 1978 | Bill Joy | csh | Le shell BSD. Sous RHEL/CentOS 8 : /usr/bin/csh | +| csh | C-Shell | 1978 | Bill Joy | csh | Le shell BSD. Sous RHEL 9: /usr/bin/csh | 
-| tcsh | Tenex C-Shell | 1979 | Ken Greer | tcsh | Un dérivé du shell csh. Sous RHEL/CentOS 8 : /usr/bin/tcsh | +| tcsh | Tenex C-Shell | 1979 | Ken Greer | tcsh | Un dérivé du shell csh. Sous RHEL : /usr/bin/tcsh | 
-| ksh | Korn Shell | 1980 | David Korn | ksh | Uniquement libre depuis 2005. Sous RHEL/CentOS 8 : /usr/bin/ksh | +| ksh | Korn Shell | 1980 | David Korn | ksh | Uniquement libre depuis 2005. Sous RHEL : /usr/bin/ksh | 
-| bash | Bourne Again Shell | 1987 | Brian Fox | bash | Le shell par défaut de Linux et de MacOS X. Sous RHEL/CentOS 8 : /usr/bin/bash | +| bash | Bourne Again Shell | 1987 | Brian Fox | bash | Le shell par défaut de Linux et de MacOS X. Sous RHEL : /usr/bin/bash | 
-| zsh | Z Shell | 1990 | Paul Falstad | zsh | Zsh est plutôt orienté pour l'interactivité avec l'utilisateur. Sous RHEL/CentOS 8 : /usr/bin/zsh |+| zsh | Z Shell | 1990 | Paul Falstad | zsh | Zsh est plutôt orienté pour l'interactivité avec l'utilisateur. Sous RHEL : /usr/bin/zsh |
  
-Sous RHEL/CentOS 8 le shell **/bin/sh** est un lien symbolique vers **/bin/bash** :+Sous RHEL le shell **/bin/sh** est un lien symbolique vers **/bin/bash** :
  
 <code> <code>
-[trainee@centos8 ~]$ ls -l /bin/sh +[trainee@redhat9 ~]$ ls -l /bin/sh 
-lrwxrwxrwx. 1 root root 4 Jul 21  2020 /bin/sh -> bash+lrwxrwxrwx. 1 root root 4 Feb 15  2024 /bin/sh -> bash
 </code> </code>
  
Ligne 126: Ligne 92:
  
 <code> <code>
-[trainee@centos7 ~]$ type cd+[trainee@redhat9 ~]$ type cd
 cd is a shell builtin cd is a shell builtin
 </code> </code>
Ligne 133: Ligne 99:
  
 <code> <code>
-[trainee@centos8 ~]$ type cd +[trainee@redhat9 ~]$ type ifconfig 
-cd is a shell builtin+ifconfig is /usr/sbin/ifconfig
 </code> </code>
  
Ligne 142: Ligne 108:
  
 <code> <code>
-[trainee@centos8 ~]$ type ls+[trainee@redhat9 ~]$ type ls
 ls is aliased to `ls --color=auto' ls is aliased to `ls --color=auto'
 </code> </code>
Ligne 153: Ligne 119:
  
 <code> <code>
-[trainee@centos8 ~]$ alias dir='ls -l' +[trainee@redhat9 ~]$ alias dir='ls -l' 
-[trainee@centos8 ~]$ dir +[trainee@redhat9 ~]$ dir 
-total 0 +total 4 
--rw-rw-r--. 1 trainee trainee 0 Apr 20 03:46 aac +-rw-r--r--. 1 trainee trainee   Sep 25 15:11 aac 
--rw-rw-r--. 1 trainee trainee 0 Apr 20 03:46 abc +-rw-r--r--. 1 trainee trainee   Sep 25 15:11 abc 
--rw-rw-r--. 1 trainee trainee 0 Apr 20 03:46 bca +-rw-r--r--. 1 trainee trainee   Sep 25 15:11 bca 
--rw-rw-r--. 1 trainee trainee 0 Apr 20 03:46 xyz+drwxr-xr-x. 2 trainee trainee   6 Oct 19  2023 Desktop 
 +drwxr-xr-x. 2 trainee trainee   6 Oct 19  2023 Documents 
 +drwxr-xr-x. 2 trainee trainee   6 Oct 19  2023 Downloads 
 +drwxr-xr-x. 2 trainee trainee   6 Oct 19  2023 Music 
 +drwxr-xr-x. 2 trainee trainee   6 Oct 19  2023 Pictures 
 +drwxr-xr-x. 2 trainee trainee   6 Oct 19  2023 Public 
 +drwxr-xr-x. 2 trainee trainee   6 Oct 19  2023 Templates 
 +drwxr-xr-x. 2 trainee trainee   6 Oct 19  2023 Videos 
 +-rw-r--r--. 1 trainee trainee 442 Sep 25 14:24 vitext 
 +-rw-r--r--. 1 trainee trainee   Sep 25 15:11 xyz
 </code> </code>
  
Ligne 169: Ligne 144:
  
 <code> <code>
-[trainee@centos8 ~]$ alias+[trainee@redhat9 ~]$ alias
 alias dir='ls -l' alias dir='ls -l'
 alias egrep='egrep --color=auto' alias egrep='egrep --color=auto'
Ligne 177: Ligne 152:
 alias ll='ls -l --color=auto' alias ll='ls -l --color=auto'
 alias ls='ls --color=auto' alias ls='ls --color=auto'
-alias vi='vim' 
-alias which='(alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot' 
 alias xzegrep='xzegrep --color=auto' alias xzegrep='xzegrep --color=auto'
 alias xzfgrep='xzfgrep --color=auto' alias xzfgrep='xzfgrep --color=auto'
Ligne 194: Ligne 167:
  
 <code> <code>
-[trainee@centos8 ~]$ \dir +[trainee@redhat9 ~]$ \dir 
-aac  abc  bca  xyz+aac  abc  bca  Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos  vitext  xyz
 </code> </code>
  
Ligne 201: Ligne 174:
  
 <code> <code>
-[trainee@centos8 ~]$ unalias dir +[trainee@redhat9 ~]$ unalias dir 
-[trainee@centos8 ~]$ dir +[trainee@redhat9 ~]$ dir 
-aac  abc  bca  xyz+aac  abc  bca  Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos  vitext  xyz
 </code> </code>
  
Ligne 211: Ligne 184:
  
 <code> <code>
-[trainee@centos8 ~]$ cat /etc/passwd+[trainee@redhat9 ~]$ cat /etc/passwd
 root:x:0:0:root:/root:/bin/bash root:x:0:0:root:/root:/bin/bash
 bin:x:1:1:bin:/bin:/sbin/nologin bin:x:1:1:bin:/bin:/sbin/nologin
Ligne 225: Ligne 198:
 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
 nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
-dbus:x:81:81:System message bus:/:/sbin/nologin 
 systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
-systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin +dbus:x:81:81:System message bus:/:/sbin/nologin
-tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin+
 polkitd:x:998:996:User for polkitd:/:/sbin/nologin polkitd:x:998:996:User for polkitd:/:/sbin/nologin
-unbound:x:997:994:Unbound DNS resolver:/etc/unbound:/sbin/nologin +avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin 
-libstoragemgmt:x:996:993:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin +tss:x:59:59:Account used for TPM access:/dev/null:/sbin/nologin 
-cockpit-ws:x:995:991:User for cockpit-ws:/nonexisting:/sbin/nologin +colord:x:997:993:User for colord:/var/lib/colord:/sbin/nologin 
-sssd:x:994:990:User for sssd:/:/sbin/nologin +clevis:x:996:992:Clevis Decryption Framework unprivileged user:/var/cache/clevis:/usr/sbin/nologin 
-setroubleshoot:x:993:989::/var/lib/setroubleshoot:/sbin/nologin +rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin 
-sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin +sssd:x:995:991:User for sssd:/:/sbin/nologin 
-chrony:x:992:988::/var/lib/chrony:/sbin/nologin+geoclue:x:994:990:User for geoclue:/var/lib/geoclue:/sbin/nologin 
 +libstoragemgmt:x:988:988:daemon account for libstoragemgmt:/:/usr/sbin/nologin 
 +systemd-oom:x:987:987:systemd Userspace OOM Killer:/:/usr/sbin/nologin 
 +setroubleshoot:x:986:986:SELinux troubleshoot server:/var/lib/setroubleshoot:/sbin/nologin 
 +pipewire:x:985:984:PipeWire System Daemon:/var/run/pipewire:/sbin/nologin 
 +flatpak:x:984:983:User for flatpak system helper:/:/sbin/nologin 
 +gdm:x:42:42::/var/lib/gdm:/sbin/nologin 
 +cockpit-ws:x:983:982:User for cockpit web service:/nonexisting:/sbin/nologin 
 +cockpit-wsinstance:x:982:981:User for cockpit-ws instances:/nonexisting:/sbin/nologin 
 +gnome-initial-setup:x:981:980::/run/gnome-initial-setup/:/sbin/nologin 
 +sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin 
 +chrony:x:980:979:chrony system user:/var/lib/chrony:/sbin/nologin 
 +dnsmasq:x:979:978:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin
 tcpdump:x:72:72::/:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin
 trainee:x:1000:1000:trainee:/home/trainee:/bin/bash trainee:x:1000:1000:trainee:/home/trainee:/bin/bash
-cockpit-wsinstance:x:991:987:User for cockpit-ws instances:/nonexisting:/sbin/nologin 
-rngd:x:990:986:Random Number Generator Daemon:/var/lib/rngd:/sbin/nologin 
-gluster:x:989:985:GlusterFS daemons:/run/gluster:/sbin/nologin 
-qemu:x:107:107:qemu user:/:/sbin/nologin 
-rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin 
-rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin 
-saslauth:x:988:76:Saslauthd user:/run/saslauthd:/sbin/nologin 
-radvd:x:75:75:radvd user:/:/sbin/nologin 
-dnsmasq:x:983:983:Dnsmasq DHCP and DNS server:/var/lib/dnsmasq:/sbin/nologin 
 </code> </code>
  
Ligne 253: Ligne 227:
  
 <code> <code>
-[trainee@centos8 ~]$ cat /etc/shells+[trainee@redhat9 ~]$ cat /etc/shells
 /bin/sh /bin/sh
 /bin/bash /bin/bash
Ligne 263: Ligne 237:
  
 <code> <code>
-[trainee@centos8 ~]$ echo $SHELL+[trainee@redhat9 ~]$ echo $SHELL
 /bin/bash /bin/bash
 </code> </code>
  
 <WRAP center round important 60%> <WRAP center round important 60%>
-**Important** : Notez sous RHEL/CentOS 8 que le système nous informe que le shell courant de l'utiisateur **trainee** est **/bin/bash** et non **/usr/bin/bash**. Ceci est du au fait que le répertoire /bin est un lien symbolique pointant vers le répertoire /usr/bin.+**Important** : Notez que sous RHEL 9, le système nous informe que le shell courant de l'utiisateur **trainee** est **/bin/bash** et non **/usr/bin/bash**. Ceci est du au fait que le répertoire /bin est un lien symbolique pointant vers le répertoire /usr/bin.
 </WRAP> </WRAP>
  
Ligne 274: Ligne 248:
  
 <code> <code>
-[trainee@centos8 ~]$ chsh+[trainee@redhat9 ~]$ chsh
 Changing shell for trainee. Changing shell for trainee.
-New shell [/bin/bash] +New shell [/bin/bash]/bin/sh
-/bin/sh+
 Password: trainee Password: trainee
 Shell changed. Shell changed.
Ligne 289: Ligne 262:
  
 <code> <code>
-[trainee@centos8 ~]$ echo $SHELL+[trainee@redhat9 ~]$ echo $SHELL
 /bin/bash /bin/bash
 </code> </code>
Ligne 296: Ligne 269:
  
 <code> <code>
-[trainee@centos8 ~]$ cat /etc/passwd | grep trainee+[trainee@redhat9 ~]$ cat /etc/passwd | grep trainee
 trainee:x:1000:1000:trainee:/home/trainee:/bin/sh trainee:x:1000:1000:trainee:/home/trainee:/bin/sh
 </code> </code>
Ligne 307: Ligne 280:
  
 <code> <code>
-[trainee@centos8 ~]$ chsh+[trainee@redhat9 ~]$ chsh
 Changing shell for trainee. Changing shell for trainee.
 New shell [/bin/sh]: /bin/bash New shell [/bin/sh]: /bin/bash
Ligne 330: Ligne 303:
  
 <code> <code>
-[trainee@centos8 ~]$ history | more+[trainee@redhat9 ~]$ history | more
     1  su -     1  su -
     2  exit     2  exit
     3  su -     3  su -
-    4  nmcli c show +    4  clear 
-    5  stty -a +    5  cd / 
-    6  date +    6  ls -l 
-    7  who +    7  cd afs 
-    8  df +    8  ls 
-    9  df -h +    9  cd / 
-   10  free free -h +   10  su 
-   11  free +   11  cd ~ 
-   12  free -h +   12  vi vitext 
-   13  whoami +   13  view vitext 
-   14  su - +   14  vi vitext 
-   15  pwd +   15  vi .exrc 
-   16  cd /tmp +   16  vi vitext 
-   17  pwd +   17  su - 
-   18  ls +   18  stty -a 
-   19  su - +   19  date 
-   20  touch test +   20  who 
-   21  ls +   21  df 
-   22  echo fenestros +   22  df -h 
-   23  cp test ~+   23  free 
 +   24  free -h 
 +   25  whoami 
 +   26  su - 
 +   27  pwd 
 +   28  cd /tmp 
 +   29  pwd 
 +   30  ls 
 +   31  su - 
 +   32  touch test 
 +   33  ls 
 +   34  echo fenestros 
 +   35  cp test ~ 
 +   36  ls -l ~ 
 +   37  file ~/test
 --More-- --More--
 +[q]
 </code> </code>
  
Ligne 386: Ligne 374:
  
 <code> <code>
-[trainee@centos8 ~]$ ls +[trainee@redhat9 ~]$ ls 
-aac  abc  bca  xyz +aac  abc  bca  Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos  vitext  xyz 
-[trainee@centos8 ~]$ !!+[trainee@redhat9 ~]$ !!
 ls ls
-aac  abc  bca  xyz+aac  abc  bca  Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos  vitext  xyz
 </code> </code>
  
Ligne 396: Ligne 384:
  
 <code> <code>
-[trainee@centos8 ~]$ history+[trainee@redhat9 ~]$ history
     1  su -     1  su -
 +    2  exit
 +    3  su -
 +    4  clear
 +    5  cd /
 +    6  ls -l
 +    7  cd afs
 +    8  ls
 +    9  cd /
 +   10  su -
 ... ...
-   80  history | more +   85  echo $SHELL 
-   81  ls +   86  cat /etc/passwd | grep trainee 
-   82  history +   87  chsh 
-[trainee@centos8 ~]$ !81+   88  history | more 
 +   89  clear 
 +   90  ls 
 +   91  history 
 +[trainee@redhat9 ~]$ !90
 ls ls
-aac  abc  bca  xyz+aac  abc  bca  Desktop  Documents  Downloads  Music  Pictures  Public  Templates  Videos  vitext  xyz
 </code> </code>
  
Ligne 410: Ligne 411:
  
 <code> <code>
-[trainee@centos8 ~]$ cat /etc/profile | grep HISTSIZE+[trainee@redhat9 ~]$ cat /etc/profile | grep HISTSIZE
 HISTSIZE=1000 HISTSIZE=1000
 export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL
Ligne 420: Ligne 421:
  
 <code> <code>
-[trainee@centos8 ~]$ nl .bash_history | tail +[trainee@redhat9 ~]$ nl .bash_history | tail 
-    54 ls +    59  ls 
-    55 ls | sort +    60  ls | sort 
-    56 ls | sort -r +    61  ls | sort -r 
-    57 more /etc/services +    62  more /etc/services 
-    58 less /etc/services +    63  less /etc/services 
-    59 find acc +    64  find acc 
-    60 find aac +    65  find aac 
-    61 su - +    66  su - 
-    62 sleep 10 +    67  sleep 10 
-    63 su -+    68  su -
 </code> </code>
  
Ligne 444: Ligne 445:
  
 <code> <code>
-[trainee@centos8 ~]$ ls .bash+[trainee@redhat9 ~]$ ls .bash
 .bash_history  .bash_logout   .bash_profile  .bashrc  .bash_history  .bash_logout   .bash_profile  .bashrc 
 </code> </code>
Ligne 459: Ligne 460:
  
 <code> <code>
-[trainee@centos8 ~]$ mo +[trainee@redhat9 ~]$ mo 
-modinfo                more                   mount.nfs4 +modinfo             modulemd-validator  more                mount.composefs     mount.fuse3          
-modprobe               mount                  mountpoint +modprobe            monitor-sensor      mount               mount.fuse          mountpoint 
-modulemd-validator     mount.fuse             mountstats +
-modulemd-validator-v1  mount.nfs +
 </code> </code>
  
Ligne 486: Ligne 485:
  
 <code> <code>
-[trainee@centos8 ~]$ mkdir training +[trainee@redhat9 ~]$ mkdir training 
-[trainee@centos8 ~]$ cd training +[trainee@redhat9 ~]$ cd training 
-[trainee@centos8 training]$ touch f1 f2 f3 f4 f5 +[trainee@redhat9 training]$ touch f1 f2 f3 f4 f5 
-[trainee@centos8 training]$ ls+[trainee@redhat9 training]$ ls
 f1  f2  f3  f4  f5 f1  f2  f3  f4  f5
 </code> </code>
Ligne 496: Ligne 495:
  
 <code> <code>
-[trainee@centos8 training]$ echo f*+[trainee@redhat9 training]$ echo f*
 f1 f2 f3 f4 f5 f1 f2 f3 f4 f5
 </code> </code>
Ligne 509: Ligne 508:
  
 <code> <code>
-[trainee@centos8 training]$ touch f52 f62+[trainee@redhat9 training]$ touch f52 f62
 </code> </code>
  
Ligne 515: Ligne 514:
  
 <code> <code>
-[trainee@centos8 training]$ echo f?2+[trainee@redhat9 training]$ echo f?2
 f52 f62 f52 f62
 </code> </code>
Ligne 536: Ligne 535:
  
 <code> <code>
-[trainee@centos8 training]$ touch a100+[trainee@redhat9 training]$ touch a100
 </code> </code>
  
Ligne 542: Ligne 541:
  
 <code> <code>
-[trainee@centos8 training]$ echo [a-f]*+[trainee@redhat9 training]$ echo [a-f]*
 a100 f1 f2 f3 f4 f5 f52 f62 a100 f1 f2 f3 f4 f5 f52 f62
 </code> </code>
Ligne 551: Ligne 550:
  
 <code> <code>
-[trainee@centos8 training]$ echo [af]*+[trainee@redhat9 training]$ echo [af]*
 a100 f1 f2 f3 f4 f5 f52 f62 a100 f1 f2 f3 f4 f5 f52 f62
 </code> </code>
Ligne 560: Ligne 559:
  
 <code> <code>
-[trainee@centos8 training]$ echo [!a]*+[trainee@redhat9 training]$ echo [!a]*
 f1 f2 f3 f4 f5 f52 f62 f1 f2 f3 f4 f5 f52 f62
 </code> </code>
Ligne 569: Ligne 568:
  
 <code> <code>
-[trainee@centos8 training]$ echo [a-b]*+[trainee@redhat9 training]$ echo [a-b]*
 a100 a100
 </code> </code>
Ligne 578: Ligne 577:
  
 <code> <code>
-[trainee@centos8 training]$ echo [a-f]+[trainee@redhat9 training]$ echo [a-f]
 [a-f] [a-f]
 </code> </code>
Ligne 591: Ligne 590:
  
 <code> <code>
-[trainee@centos8 training]$ shopt -s extglob+[trainee@redhat9 training]$ shopt -s extglob
 </code> </code>
  
Ligne 597: Ligne 596:
  
 <code> <code>
-[trainee@centos8 training]$ shopt +[trainee@redhat9 training]$ shopt 
-autocd         off +autocd          off 
-cdable_vars     off +assoc_expand_once       off 
-cdspell         off +cdable_vars     off 
-checkhash       off +cdspell         off 
-checkjobs       off +checkhash       off 
-checkwinsize   on +checkjobs       off 
-cmdhist         on +checkwinsize    on 
-compat31       off +cmdhist         on 
-compat32       off +compat31        off 
-compat40       off +compat32        off 
-compat41       off +compat40        off 
-direxpand       off +compat41        off 
-dirspell       off +compat42        off 
-dotglob         off +compat43        off 
-execfail       off +compat44        off 
-expand_aliases  on +complete_fullquote      on 
-extdebug       off +direxpand       off 
-extglob         on +dirspell        off 
-extquote       on +dotglob         off 
-failglob       off +execfail        off 
-force_fignore   on +expand_aliases  on 
-globstar       off +extdebug        off 
-gnu_errfmt     off +extglob         on 
-histappend     on +extquote        on 
-histreedit     off +failglob        off 
-histverify     off +force_fignore   on 
-hostcomplete   off +globasciiranges on 
-huponexit       off +globstar        off 
-interactive_comments on +gnu_errfmt      off 
-lastpipe       off +histappend      on 
-lithist         off +histreedit      off 
-login_shell     on +histverify      off 
-mailwarn       off +hostcomplete    off 
-no_empty_cmd_completion off +huponexit       off 
-nocaseglob     off +inherit_errexit off 
-nocasematch     off +interactive_comments    on 
-nullglob       off +lastpipe        off 
-progcomp       on +lithist         off 
-promptvars     on +localvar_inherit        off 
-restricted_shell off +localvar_unset  off 
-shift_verbose   off +login_shell     on 
-sourcepath     on +mailwarn        off 
-xpg_echo       of+no_empty_cmd_completion off 
 +nocaseglob      off 
 +nocasematch     off 
 +nullglob        off 
 +progcomp        on 
 +progcomp_alias  off 
 +promptvars      on 
 +restricted_shell        off 
 +shift_verbose   off 
 +sourcepath      on 
 +syslog_history  off 
 +xpg_echo        off
 </code> </code>
  
Ligne 648: Ligne 658:
  
 <code> <code>
-[trainee@centos8 training]$ touch f f.txt f123.txt f123123.txt f123123123.txt+[trainee@redhat9 training]$ touch f f.txt f123.txt f123123.txt f123123123.txt
 </code> </code>
  
Ligne 654: Ligne 664:
  
 <code> <code>
-[trainee@centos8 training]$ ls f?(123).txt+[trainee@redhat9 training]$ ls f?(123).txt
 f123.txt  f.txt f123.txt  f.txt
 </code> </code>
Ligne 667: Ligne 677:
  
 <code> <code>
-[trainee@centos8 training]$ ls f*(123).txt+[trainee@redhat9 training]$ ls f*(123).txt
 f123123123.txt  f123123.txt  f123.txt  f.txt f123123123.txt  f123123.txt  f123.txt  f.txt
 </code> </code>
Ligne 680: Ligne 690:
  
 <code> <code>
-[trainee@centos8 training]$ ls f+(123).txt+[trainee@redhat9 training]$ ls f+(123).txt
 f123123123.txt  f123123.txt  f123.txt f123123123.txt  f123123.txt  f123.txt
 </code> </code>
Ligne 693: Ligne 703:
  
 <code> <code>
-[trainee@centos8 training]$ ls f@(123).txt+[trainee@redhat9 training]$ ls f@(123).txt
 f123.txt f123.txt
 </code> </code>
Ligne 706: Ligne 716:
  
 <code> <code>
-[trainee@centos8 training]$ ls f!(123).txt+[trainee@redhat9 training]$ ls f!(123).txt
 f123123123.txt  f123123.txt  f.txt f123123123.txt  f123123.txt  f.txt
 </code> </code>
Ligne 730: Ligne 740:
  
 <code> <code>
-[trainee@centos8 training]$ echo * est un caractère spécial+[trainee@redhat9 training]$ echo * est un caractère spécial
 a100 f f1 f123123123.txt f123123.txt f123.txt f2 f3 f4 f5 f52 f62 f.txt est un caractère spécial a100 f f1 f123123123.txt f123123.txt f123.txt f2 f3 f4 f5 f52 f62 f.txt est un caractère spécial
  
-[trainee@centos8 training]$ echo \* est un caractère spécial+[trainee@redhat9 training]$ echo \* est un caractère spécial
 * est un caractère spécial * est un caractère spécial
  
-[trainee@centos8 training]$ echo "* est un caractère spécial"+[trainee@redhat9 training]$ echo "* est un caractère spécial"
 * est un caractère spécial * est un caractère spécial
  
-[trainee@centos8 training]$ echo '* est un caractère spécial'+[trainee@redhat9 training]$ echo '* est un caractère spécial'
 * est un caractère spécial * est un caractère spécial
 </code> </code>
Ligne 750: Ligne 760:
  
 <code> <code>
-[trainee@centos8 training]$ cd .. +[trainee@redhat9 training]$ cd .. 
-[trainee@centos8 ~]$ mkdir codes +[trainee@redhat9 ~]$ mkdir codes 
-[trainee@centos8 ~]$ echo $?+[trainee@redhat9 ~]$ echo $?
 0 0
-[trainee@centos8 ~]$ touch codes/exit.txt +[trainee@redhat9 ~]$ touch codes/exit.txt 
-[trainee@centos8 ~]$ rmdir codes +[trainee@redhat9 ~]$ rmdir codes 
-rmdir: failed to remove codes: Directory not empty +rmdir: failed to remove 'codes': Directory not empty 
-[trainee@centos8 ~]$ echo $?+[trainee@redhat9 ~]$ echo $?
 1 1
 </code> </code>
Ligne 784: Ligne 794:
  
 <code> <code>
-[trainee@centos8 ~]$ pwd+[trainee@redhat9 ~]$ pwd
 /home/trainee /home/trainee
-[trainee@centos8 ~]$ cd training +[trainee@redhat9 ~]$ cd training 
-[trainee@centos8 training]$ free > file +[trainee@redhat9 training]$ free > file 
-[trainee@centos8 training]$ cat file +[trainee@redhat9 training]$ cat file 
-              total        used        free      shared  buff/cache   available +               total        used        free      shared  buff/cache   available 
-Mem:         500780      192692       38916        4824      269172      260472 +Mem:         7869560      996400     4964048       15324     2229600     6873160 
-Swap:       2096124           0     2096124+Swap:        5242876           0     5242876
 </code> </code>
  
Ligne 799: Ligne 809:
  
 <code> <code>
-[trainee@centos8 training]$ date > file +[trainee@redhat9 training]$ date > file 
-[trainee@centos8 training]$ cat file +[trainee@redhat9 training]$ cat file 
-Mon 28 Nov 15:48:09 CET 2016+Thu Sep 26 12:49:11 PM CEST 2024
 </code> </code>
  
Ligne 807: Ligne 817:
  
 <code> <code>
-[trainee@centos8 training]$ free >> file +[trainee@redhat9 training]$ free >> file 
-[trainee@centos8 training]$ cat file +[trainee@redhat9 training]$ cat file 
-Mon 28 Nov 15:48:09 CET 2016 +Thu Sep 26 12:49:11 PM CEST 2024 
-              total        used        free      shared  buff/cache   available +               total        used        free      shared  buff/cache   available 
-Mem:         500780      192792       38516        4824      269472      260376 +Mem:         7869560      996392     4964048       15324     2229608     6873168 
-Swap:       2096124           0     2096124+Swap:        5242876           0     5242876
 </code> </code>
  
-De cette façon, la date du jour sera rajoutée à la fin de votre fichier après les informations de la commande free.+De cette façon, la sortie de la commande free sera ajoutée à la fin de votre fichier après les informations de la commande free.
  
 <WRAP center round important 60%> <WRAP center round important 60%>
Ligne 830: Ligne 840:
  
 <code> <code>
-[trainee@centos8 training]$ cd .. +[trainee@redhat9 training]$ cd .. 
-[trainee@centos8 ~]$ rmdir training/ 2>errorlog +[trainee@redhat9 ~]$ rmdir training/ 2>errorlog 
-[trainee@centos8 ~]$ cat errorlog +[trainee@redhat9 ~]$ cat errorlog  
-rmdir: failed to remove training/: Directory not empty+rmdir: failed to remove 'training/': Directory not empty
 </code> </code>
  
Ligne 843: Ligne 853:
  
 <code> <code>
-[trainee@centos8 ~]$ free > file 2>&1+[trainee@redhat9 ~]$ free > file 2>&1
 </code> </code>
  
Ligne 851: Ligne 861:
  
 <code> <code>
-[trainee@centos8 ~]$ wc -w < errorlog+[trainee@redhat9 ~]$ wc -w < errorlog
 8 8
 </code> </code>
Ligne 871: Ligne 881:
  
 <code> <code>
-[trainee@centos8 ~]$ ls | wc -w +[trainee@redhat9 ~]$ ls | wc -w 
-7+17
 </code> </code>
  
Ligne 884: Ligne 894:
  
 <code> <code>
-[trainee@centos8 ~]$ date | tee file1 +[trainee@redhat9 ~]$ date | tee file1 
-Tue 20 Apr 10:39:47 EDT 2021 +Thu Sep 26 12:54:36 PM CEST 2024 
-[trainee@centos8 ~]$ cat file1 +[trainee@redhat9 ~]$ cat file1 
-Tue 20 Apr 10:39:47 EDT 2021+Thu Sep 26 12:54:36 PM CEST 2024
 </code> </code>
  
Ligne 893: Ligne 903:
  
 <code> <code>
-[trainee@centos8 ~]$ date | tee file1 > file2 +[trainee@redhat9 ~]$ date | tee file1 > file2 
-[trainee@centos8 ~]$ cat file1 +[trainee@redhat9 ~]$ cat file1 
-Tue 20 Apr 10:40:36 EDT 2021 +Thu Sep 26 12:55:11 PM CEST 2024 
-[trainee@centos8 ~]$ cat file2 +[trainee@redhat9 ~]$ cat file2 
-Tue 20 Apr 10:40:36 EDT 2021+Thu Sep 26 12:55:11 PM CEST 2024
 </code> </code>
  
Ligne 909: Ligne 919:
  
 <code> <code>
-[trainee@centos8 ~]$ echo date+[trainee@redhat9 ~]$ echo date
 date date
-[trainee@centos8 ~]$ echo $(date) +[trainee@redhat9 ~]$ echo $(date) 
-Tue 20 Apr 10:41:33 EDT 2021 +Thu Sep 26 12:56:02 PM CEST 2024 
-[trainee@centos8 ~]$ echo `date` +[trainee@redhat9 ~]$ echo `date` 
-Tue 20 Apr 10:41:45 EDT 2021+Thu Sep 26 12:56:17 PM CEST 2024
 </code> </code>
  
Ligne 1023: Ligne 1033:
  
 <code> <code>
-[trainee@centos8 ~]$ echo $LC_ALL+[trainee@redhat9 ~]$ echo $LC_ALL
  
-[trainee@centos8 ~]$ echo $LC_CTYPE+[trainee@redhat9 ~]$ echo $LC_CTYPE
  
-[trainee@centos8 ~]$ echo $LANG +[trainee@redhat9 ~]$ echo $LANG 
-en_GB.UTF-8 +en_US.UTF-8 
-[trainee@centos8 ~]$ locale +[trainee@redhat9 ~]$ locale 
-LANG=en_GB.UTF-8 +LANG=en_US.UTF-8 
-LC_CTYPE="en_GB.UTF-8" +LC_CTYPE="en_US.UTF-8" 
-LC_NUMERIC="en_GB.UTF-8" +LC_NUMERIC="en_US.UTF-8" 
-LC_TIME="en_GB.UTF-8" +LC_TIME="en_US.UTF-8" 
-LC_COLLATE="en_GB.UTF-8" +LC_COLLATE="en_US.UTF-8" 
-LC_MONETARY="en_GB.UTF-8" +LC_MONETARY="en_US.UTF-8" 
-LC_MESSAGES="en_GB.UTF-8" +LC_MESSAGES="en_US.UTF-8" 
-LC_PAPER="en_GB.UTF-8" +LC_PAPER="en_US.UTF-8" 
-LC_NAME="en_GB.UTF-8" +LC_NAME="en_US.UTF-8" 
-LC_ADDRESS="en_GB.UTF-8" +LC_ADDRESS="en_US.UTF-8" 
-LC_TELEPHONE="en_GB.UTF-8" +LC_TELEPHONE="en_US.UTF-8" 
-LC_MEASUREMENT="en_GB.UTF-8" +LC_MEASUREMENT="en_US.UTF-8" 
-LC_IDENTIFICATION="en_GB.UTF-8"+LC_IDENTIFICATION="en_US.UTF-8"
 LC_ALL= LC_ALL=
 </code> </code>
Ligne 1063: Ligne 1073:
  
 <code> <code>
-[trainee@centos8 ~]$ env +[trainee@redhat9 ~]$ env 
-LS_COLORS=rs=0:di=38;5;33:ln=38;5;51:mh=00:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=01;05;37;41:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;40:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.zst=38;5;9:*.tzst=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.wim=38;5;9:*.swm=38;5;9:*.dwm=38;5;9:*.esd=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.mjpg=38;5;13:*.mjpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.m4a=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.oga=38;5;45:*.opus=38;5;45:*.spx=38;5;45:*.xspf=38;5;45: +SHELL=/bin/bash
-SSH_CONNECTION=10.0.2.2 42834 10.0.2.15 22 +
-LANG=en_GB.UTF-8+
 HISTCONTROL=ignoredups HISTCONTROL=ignoredups
-GUESTFISH_RESTORE=\e[0m +HISTSIZE=1000 
-HOSTNAME=centos8.ittraining.loc +HOSTNAME=redhat9.ittraining.loc
-GUESTFISH_INIT=\e[1;34m +
-XDG_SESSION_ID=9 +
-USER=trainee +
-GUESTFISH_PS1=\[\e[1;32m\]><fs>\[\e[0;31m\]  +
-SELINUX_ROLE_REQUESTED=+
 PWD=/home/trainee PWD=/home/trainee
 +LOGNAME=trainee
 +XDG_SESSION_TYPE=tty
 +MOTD_SHOWN=pam
 HOME=/home/trainee HOME=/home/trainee
-SSH_CLIENT=10.0.2.2 42834 22 +LANG=en_US.UTF-8 
-SELINUX_LEVEL_REQUESTED+LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.m4a=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.oga=01;36:*.opus=01;36:*.spx=01;36:*.xspf=01;36: 
-SSH_TTY=/dev/pts/+SSH_CONNECTION=10.0.2.1 37578 10.0.2.101 22 
-MAIL=/var/spool/mail/trainee+XDG_SESSION_CLASS=user 
 +SELINUX_ROLE_REQUESTED=
 TERM=xterm-256color TERM=xterm-256color
-SHELL=/bin/bash+LESSOPEN=||/usr/bin/lesspipe.sh %s 
 +USER=trainee
 SELINUX_USE_CURRENT_RANGE= SELINUX_USE_CURRENT_RANGE=
 SHLVL=1 SHLVL=1
-LOGNAME=trainee +XDG_SESSION_ID=4
-DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus+
 XDG_RUNTIME_DIR=/run/user/1000 XDG_RUNTIME_DIR=/run/user/1000
 +SSH_CLIENT=10.0.2.1 37578 22
 +which_declare=declare -f
 +XDG_DATA_DIRS=/home/trainee/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
 PATH=/home/trainee/.local/bin:/home/trainee/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin PATH=/home/trainee/.local/bin:/home/trainee/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
-GUESTFISH_OUTPUT=\e[0m +SELINUX_LEVEL_REQUESTED
-HISTSIZE=1000 +DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus 
-LESSOPEN=||/usr/bin/lesspipe.sh %s+MAIL=/var/spool/mail/trainee 
 +SSH_TTY=/dev/pts/
 +BASH_FUNC_which%%=() {  ( alias; 
 + eval ${which_declare} ) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot $@ 
 +}
 _=/usr/bin/env _=/usr/bin/env
 OLDPWD=/home/trainee/training OLDPWD=/home/trainee/training
Ligne 1109: Ligne 1123:
  
 <code> <code>
-[trainee@centos8 ~]$ set -o +[trainee@redhat9 ~]$ set -o 
-allexport       off +allexport       off 
-braceexpand     on +braceexpand     on 
-emacs           on +emacs           on 
-errexit         off +errexit         off 
-errtrace       off +errtrace        off 
-functrace       off +functrace       off 
-hashall         on +hashall         on 
-histexpand     on +histexpand      on 
-history         on +history         on 
-ignoreeof       off +ignoreeof       off 
-interactive-comments on +interactive-comments    on 
-keyword         off +keyword         off 
-monitor         on +monitor         on 
-noclobber       off +noclobber       off 
-noexec         off +noexec          off 
-noglob         off +noglob          off 
-nolog           off +nolog           off 
-notify         off +notify          off 
-nounset         off +nounset         off 
-onecmd         off +onecmd          off 
-physical       off +physical        off 
-pipefail       off +pipefail        off 
-posix           off +posix           off 
-privileged     off +privileged      off 
-verbose         off +verbose         off 
-vi             off +vi              off 
-xtrace         off+xtrace          off
 </code> </code>
  
Ligne 1142: Ligne 1156:
  
 <code> <code>
-[trainee@centos8 ~]$ set -o allexport +[trainee@redhat9 ~]$ set -o allexport 
-[trainee@centos8 ~]$ set -o +[trainee@redhat9 ~]$ set -o 
-allexport       on +allexport       on 
-braceexpand     on +braceexpand     on 
-...+emacs           on 
 +errexit         off 
 +errtrace        off 
 +functrace       off 
 +hashall         on 
 +histexpand      on 
 +history         on 
 +ignoreeof       off 
 +interactive-comments    on 
 +keyword         off 
 +monitor         on 
 +noclobber       off 
 +noexec          off 
 +noglob          off 
 +nolog           off 
 +notify          off 
 +nounset         off 
 +onecmd          off 
 +physical        off 
 +pipefail        off 
 +posix           off 
 +privileged      off 
 +verbose         off 
 +vi              off 
 +xtrace          off
 </code> </code>
  
Ligne 1156: Ligne 1194:
  
 <code> <code>
-[trainee@centos8 ~]$ set +o allexport +[trainee@redhat9 ~]$ set +o allexport 
-[trainee@centos8 ~]$ set -o +[trainee@redhat9 ~]$ set -o 
-allexport       off +allexport       off 
-braceexpand     on +braceexpand     on 
-...+emacs           on 
 +errexit         off 
 +errtrace        off 
 +functrace       off 
 +hashall         on 
 +histexpand      on 
 +history         on 
 +ignoreeof       off 
 +interactive-comments    on 
 +keyword         off 
 +monitor         on 
 +noclobber       off 
 +noexec          off 
 +noglob          off 
 +nolog           off 
 +notify          off 
 +nounset         off 
 +onecmd          off 
 +physical        off 
 +pipefail        off 
 +posix           off 
 +privileged      off 
 +verbose         off 
 +vi              off 
 +xtrace          off
 </code> </code>
  
Ligne 1180: Ligne 1242:
  
 <code> <code>
-[trainee@centos8 ~]$ set -o noclobber +[trainee@redhat9 ~]$ set -o noclobber 
-[trainee@centos8 ~]$ pwd > file+[trainee@redhat9 ~]$ pwd > file
 -bash: file: cannot overwrite existing file -bash: file: cannot overwrite existing file
-[trainee@centos8 ~]$ pwd > file +[trainee@redhat9 ~]$ pwd >file 
--bash: file: cannot overwrite existing file +[trainee@redhat9 ~]$ cat file 
-[trainee@centos8 ~]$ pwd >| file +/home/trainee 
-[trainee@centos8 ~]$ set +o noclobber+[trainee@redhat9 ~]$ set +o noclobber
 </code> </code>
  
Ligne 1196: Ligne 1258:
  
 <code> <code>
-[trainee@centos8 ~]$ set -o noglob +[trainee@redhat9 ~]$ set -o noglob 
-[trainee@centos8 ~]$ echo *+[trainee@redhat9 ~]$ echo *
 * *
-[trainee@centos8 ~]$ set +o noglob +[trainee@redhat9 ~]$ set +o noglob 
-[trainee@centos8 ~]$ echo * +[trainee@redhat9 ~]$ echo * 
-aac abc bca codes Desktop Documents Downloads errorlog file file1 Music Pictures Public Templates training Videos vitext xyz+aac abc bca codes Desktop Documents Downloads errorlog file file1 file2 list Music Pictures Public Templates training Videos vitext xyz
 </code> </code>
  
Ligne 1211: Ligne 1273:
  
 <code> <code>
-[trainee@centos8 ~]$ set -o nounset +[trainee@redhat9 ~]$ set -o nounset 
-[trainee@centos8 ~]$ echo $FENESTROS+[trainee@redhat9 ~]$ echo $FENESTROS
 -bash: FENESTROS: unbound variable -bash: FENESTROS: unbound variable
-[trainee@centos8 ~]$ set +o nounset +[trainee@redhat9 ~]$ set +o nounset 
-[trainee@centos8 ~]$ echo $FENESTROS+[trainee@redhat9 ~]$ echo $FENESTROS
  
-[trainee@centos8 ~]$ +[trainee@redhat9 ~]$
 </code> </code>
  
Ligne 1223: Ligne 1285:
 **Important** : Notez que la variable inexistante **$FENESTROS** est identifiée comme telle sous l'influence de l'option **nounset**. Or le comportement habituel de Linux est de retourner une ligne vide qui n'indique pas si la variable n’existe pas ou si elle est simplement vide. **Important** : Notez que la variable inexistante **$FENESTROS** est identifiée comme telle sous l'influence de l'option **nounset**. Or le comportement habituel de Linux est de retourner une ligne vide qui n'indique pas si la variable n’existe pas ou si elle est simplement vide.
 </WRAP> </WRAP>
- 
-===== LAB #2 - Les Scripts Shell ===== 
- 
-Le but de la suite de cette unité est de vous amener au point où vous êtes capable de comprendre et de déchiffrer les scripts, notamment les scripts de démarrage ainsi que les scripts de contrôle des services.  
- 
-Écrire des scripts compliqués est en dehors de la portée de cette unité car il nécessite une approche programmation qui ne peut être adressée que lors d'une formation dédiée à l'écriture des scripts. 
- 
-==== 2.1 - Exécution ==== 
- 
-Un script shell est un fichier dont le contenu est lu en entrée standard par le shell. Le contenu du fichier est lu et exécuté d'une manière séquentielle. Afin qu'un script soit exécuté, il suffit qu'il puisse être lu au quel cas le script est exécuté par un shell fils soit en l'appelant en argument à l'appel du shell : 
- 
-**/bin/bash myscript** 
- 
-soit en redirigeant son entrée standard : 
- 
-**/bin/bash < myscript** 
- 
-Dans le cas où le droit d'exécution est positionné sur le fichier script et à condition que celui-ci se trouve dans un répertoire spécifié dans le PATH de l'utilisateur qui le lance, le script peut être lancé en l'appelant simplement par son nom : 
- 
-**myscript** 
- 
-Pour lancer le script sans qu'il soit dans un répertoire du PATH, il convient de se placer dans le répertoire contenant le script et de le lancer ainsi : 
- 
-**./myscript** 
- 
-Dans le cas où le script doit être exécuté par le shell courant, dans les mêmes conditions que l'exemple précédent, et non par un shell fils, il convient de le lancer ainsi : 
- 
-**. myscript** 
- 
-Dans un script il est fortement conseillé d'inclure des commentaires. Les commentaires permettent à d'autres personnes de comprendre le script. Toute ligne de commentaire commence avec le caractère **#**.  
- 
-Il existe aussi un **pseudo commentaire** qui est placé au début du script. Ce pseudo commentaire permet de stipuler quel shell doit être utilisé pour l'exécution du script. L'exécution du script est ainsi rendu indépendant du shell de l'utilisateur qui le lance. Le pseudo commentaire commence avec les caractères **#!**. Chaque script commence donc par une ligne similaire à celle-ci : 
- 
-  #!/bin/sh 
- 
-Puisque un script contient des lignes de commandes qui peuvent être saisies en shell intéractif, il est souvent issu d'une procédure manuelle. Afin de faciliter la création d'un script il existe une commande, **script**, qui permet d'enregistrer les textes sortis sur la sortie standard, y compris le prompt dans un fichier dénommé **typescript**. Afin d'illustrer l'utilisation de cette commande, saisissez la suite de commandes suivante : 
- 
-<code> 
-[trainee@centos8 ~]$ script 
-Script started, file is typescript 
-[trainee@centos8 ~]$ pwd 
-/home/trainee 
-[trainee@centos8 ~]$ ls 
-aac  abc  bca  codes  errorlog  file  file1  file2  training  typescript  xyz 
-[trainee@centos8 ~]$ exit 
-exit 
-Script done, file is typescript 
- 
-[trainee@centos8 ~]$ cat typescript  
-Script started on 2021-04-20 10:59:58-04:00 
-[trainee@centos8 ~]$ pwd 
-/home/trainee 
-[trainee@centos8 ~]$ ls 
-aac  abc  bca  codes  errorlog  file  file1  file2  training  typescript  xyz 
-[trainee@centos8 ~]$ exit 
-exit 
- 
-Script done on 2021-04-20 11:00:09-04:00 
-</code> 
- 
-Cette procédure peut être utilisée pour enregistrer une suite de commandes longues et compliquées afin d'écrire un script. 
- 
-Pour illustrer l'écriture et l'exécution d'un script, créez le fichier **myscript** avec **vi** : 
- 
-<code> 
-[trainee@centos8 ~]$ vi myscript 
-[trainee@centos8 ~]$ cat myscript 
-pwd 
-ls 
-</code> 
- 
-Sauvegardez votre fichier. Lancez ensuite votre script en passant le nom du fichier en argument à /bin/bash : 
- 
-<code> 
-[trainee@centos8 ~]$ /bin/bash myscript 
-/home/trainee 
-aac  bca    errorlog  file1  myscript  typescript 
-abc  codes  file      file2  training  xyz 
-</code> 
- 
-Lancez ensuite le script en redirigeant son entrée standard : 
- 
-<code> 
-[trainee@centos8 ~]$ /bin/bash < myscript 
-/home/trainee 
-aac  bca    errorlog  file1  myscript  typescript 
-abc  codes  file      file2  training  xyz 
-</code> 
- 
-Pour lancer le script en l'appelant simplement par son nom, son chemin doit être inclus dans votre PATH: 
- 
-<code> 
-[trainee@centos8 ~]$ echo $PATH 
-/home/trainee/.local/bin:/home/trainee/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin 
-</code> 
- 
-Dans le cas de RHEL/CentOS, même si PATH contient $HOME/bin, le répertoire n'existe pas : 
- 
-<code> 
-[trainee@centos8 ~]$ ls 
-aac  bca    errorlog  file1  myscript  typescript 
-abc  codes  file      file2  training  xyz 
-</code> 
- 
-Créez donc ce répertoire : 
- 
-<code> 
-[trainee@centos8 ~]$ mkdir bin 
-</code> 
- 
-Ensuite déplacez votre script dans ce répertoire et rendez-le exécutable pour votre utilisateur : 
- 
-<code> 
-[trainee@centos8 ~]$ mv myscript ~/bin 
-[trainee@centos8 ~]$ chmod u+x ~/bin/myscript 
-</code> 
- 
-Exécutez maintenant votre script en l'appelant par son nom à partir du répertoire **/tmp** : 
- 
-<code> 
-[trainee@centos8 ~]$ cd /tmp 
-[trainee@centos8 tmp]$ myscript 
-/tmp 
-expand 
-expand1 
-filepartaa 
-filepartab 
-filepartac 
-filepartad 
-filepartae 
-greptest 
-greptest1 
-greptest.patch 
-newfile 
-sales.awk 
-sales.txt 
-scriptawk 
-sedtest 
-sedtest1 
-systemd-private-d9ff2376a8a44f0392f860d80c839be4-chronyd.service-6im4Ii 
-</code> 
- 
-Placez-vous dans le répertoire contenant le script et saisissez les commandes suivantes : 
- 
-<code> 
-[trainee@centos8 tmp]$ cd ~/bin 
-[trainee@centos8 bin]$ ./myscript 
-/home/trainee/bin 
-myscript 
-[trainee@centos8 bin]$ . myscript 
-/home/trainee/bin 
-myscript 
-</code> 
- 
-<WRAP center round todo 60%> 
-**A faire** : Notez bien la différence entre les sorties de cette dernière commande et la précédente. Expliquez pourquoi. 
-</WRAP> 
- 
-====2.2 - La commande read==== 
- 
-La commande **read** lit son entrée standard et affecte les mots saisis dans la ou les variable(s) passée(s) en argument. La séparation entre le contenu des variables est l'espace. Par conséquent il est intéressant de noter les exemples suivants : 
- 
-<code> 
-[trainee@centos8 bin]$ read var1 var2 var3 var4 
-fenestros edu is great! 
-[trainee@centos8 bin]$ echo $var1 
-fenestros 
-[trainee@centos8 bin]$ echo $var2 
-edu 
-[trainee@centos8 bin]$ echo $var3 
-is 
-[trainee@centos8 bin]$ echo $var4 
-great! 
-</code> 
- 
-<WRAP center round important 60%> 
-**Important**: Notez que chaque champs a été placé dans une variable différente. Notez aussi que par convention les variables déclarées par des utilisateurs sont en miniscules afin de les distinguer des variables système qui sont en majuscules. 
-</WRAP> 
- 
-<code> 
-[trainee@centos8 bin]$ read var1 var2 
-fenestros edu is great! 
-[trainee@centos8 bin]$ echo $var1 
-fenestros 
-[trainee@centos8 bin]$ echo $var2 
-edu is great! 
-</code> 
- 
-<WRAP center round important 60%> 
-**Important** : Notez que dans le deuxième cas, le reste de la ligne après le mot //fenestros// est mis dans **$var2**. 
-</WRAP> 
- 
-===Code de retour=== 
- 
-La commande **read** renvoie un code de retour de **0** dans le cas où elle ne reçoit pas l'information **fin de fichier** matérialisée par les touches <key>C-d</key>. Le contenu de la variable **var** peut être vide et la valeur du code de retour **0** grâce à l'utilisation de la touche <key>entrée</key> : 
- 
-<code> 
-[trainee@centos8 bin]$ read var 
-</code> 
-<key>Entrée</key> 
-<code> 
-[trainee@centos8 bin]$ echo $? 
-0 
-[trainee@centos8 bin]$ echo $var 
- 
-[trainee@centos8 bin]$  
-</code> 
- 
-Le contenu de la variable **var** peut être vide et la valeur du code de retour **autre que 0** grâce à l'utilisation des touches <key>C-d</key> : 
- 
-<code> 
-[trainee@centos8 bin]$ read var 
-</code> 
-<key>C-d</key> 
-<code> 
-[trainee@centos8 bin]$ echo $? 
-1 
-[trainee@centos8 bin]$ echo $var 
- 
-[trainee@centos8 bin]$  
-</code> 
- 
-===La variable IFS=== 
- 
-La variable IFS contient par défaut les caractères <key>espace</key>, <key>tab</key> et <key>entrée</key> : 
- 
-<code> 
-[trainee@centos8 bin]$ echo "$IFS" | od -c 
-0000000      \t  \n  \n 
-0000004 
-</code> 
- 
-<WRAP center round important 60%> 
-**Important** : La commande **od** (//Octal Dump//) renvoie le contenu d'un fichier ou de l'entrée standard au format octal. Ceci est utile afin de visualiser les caractères non-imprimables. L'option **-c** permet de sélectionner des caractères ASCII ou des backslash dans le fichier ou dans le contenu fourni à l'entrée standard. 
-</WRAP> 
- 
-La valeur de cette variable définit donc le séparateur de mots lors de la saisie des contenus des variables avec la commande **read**. La valeur de la variable **IFS** peut être modifiée : 
- 
-<code> 
-[trainee@centos8 bin]$ OLDIFS="$IFS" 
-[trainee@centos8 bin]$ IFS=":" 
-[trainee@centos8 bin]$ echo "$IFS" | od -c 
-0000000   :  \n 
-0000002 
-</code> 
- 
-De cette façon l'espace redevient un caractère normal : 
- 
-<code> 
-[trainee@centos8 bin]$ read var1 var2 var3 
-fenestros:edu is:great! 
-[trainee@centos8 bin]$ echo $var1 
-fenestros 
-[trainee@centos8 bin]$ echo $var2 
-edu is 
-[trainee@centos8 bin]$ echo $var3 
-great! 
-</code> 
- 
-Restaurez l'ancienne valeur de IFS avec la commande IFS="$OLDIFS" 
- 
-<code> 
-[trainee@centos8 bin]$ IFS="$OLDIFS" 
-[trainee@centos8 bin]$ echo "$IFS" | od -c 
-0000000      \t  \n  \n 
-0000004 
-</code> 
- 
-====2.3 - La commande test==== 
- 
-La commande **test** peut être utilisée avec deux syntaxes : 
- 
-**test** //expression// 
- 
-ou 
- 
-**[**<key>espace</key>//expression//<key>espace</key>**]** 
- 
-===Tests de Fichiers=== 
- 
-^ Test ^ Description ^ 
-| -f fichier | Retourne vrai si fichier est d'un type standard | 
-| -d fichier | Retourne vrai si fichier est d'un type répertoire | 
-| -r fichier | Retourne vrai si l'utilisateur peut lire fichier | 
-| -w fichier | Retourne vrai si l'utilisateur peut modifier fichier | 
-| -x fichier | Retourne vrai si l'utilisateur peut exécuter fichier | 
-| -e fichier | Retourne vrai si fichier existe | 
-| -s fichier | Retourne vrai si fichier n'est pas vide | 
-| fichier1 -nt fichier2 | Retourne vrai si fichier1 est plus récent que fichier2 | 
-| fichier1 -ot fichier2 | Retourne vrai si fichier1 est plus ancien que fichier2 | 
-| fichier1 -ef fichier2 | Retourne vrai si fichier1 est identique à fichier2 | 
- 
- 
-Testez si le fichier **a100** est un fichier ordinaire : 
- 
-<code> 
-[trainee@centos8 bin]$ cd ../training/ 
-[trainee@centos8 training]$ test -f a100 
-[trainee@centos8 training]$ echo $?  
-0 
-[trainee@centos8 training]$ [ -f a100 ] 
-[trainee@centos8 training]$ echo $?  
-0 
-</code> 
- 
-Testez si le fichier a101 existe : 
- 
-<code> 
-[trainee@centos8 training]$ [ -f a101 ] 
-[trainee@centos8 training]$ echo $? 
-1 
-</code> 
- 
-Testez si /home/trainee/training est un répertoire : 
- 
-<code> 
-[trainee@centos8 training]$ [ -d /home/trainee/training ] 
-[trainee@centos8 training]$ echo $? 
-0 
-</code> 
- 
-===Tests de chaînes de caractère=== 
- 
-^ Test ^ Description ^ 
-| -n chaîne | Retourne vrai si chaîne n'est pas de longueur 0 | 
-| -z chaîne | Retourne vrai si chaîne est de longueur 0 | 
-| string1 = string2 | Retourne vrai si string1 est égale à string2 | 
-| string1 != string2 | Retourne vrai si string1 est différente de string2 | 
-| string1 | Retourne vrai si string1 n'est pas vide | 
- 
-Testez si les deux chaînes sont égales : 
- 
-<code> 
-[trainee@centos8 training]$ string1="root" 
-[trainee@centos8 training]$ string2="fenestros" 
-[trainee@centos8 training]$ [ $string1 = $string2 ] 
-[trainee@centos8 training]$ echo $? 
-1 
-</code> 
- 
-Testez si la string1 n'a pas de longueur 0 : 
- 
-<code> 
-[trainee@centos8 training]$ [ -n $string1 ] 
-[trainee@centos8 training]$ echo $? 
-0 
-</code> 
- 
-Testez si la string1 a une longueur de 0 : 
- 
-<code> 
-[trainee@centos8 training]$ [ -z $string1 ] 
-[trainee@centos8 training]$ echo $? 
-1 
-</code> 
- 
-===Tests sur des nombres=== 
- 
-^ Test ^ Description ^ 
-| value1 -eq value2 | Retourne vrai si value1 est égale à value2 | 
-| value1 -ne value2 | Retourne vrai si value1 n'est pas égale à value2 | 
-| value1 -lt value2 | Retourne vrai si value1 est inférieure à value2 | 
-| value1 -le value2 | Retourne vrai si value1 est inférieur ou égale à value2 | 
-| value1 -gt value2 | Retourne vrai si value1 est supérieure à value2 | 
-| value1 -ge value2 | Retourne vrai si value1 est supérieure ou égale à value2 | 
- 
-Comparez les deux nombres **value1** et **value2** : 
- 
-<code> 
-[trainee@centos8 training]$ read value1 
-35 
-[trainee@centos8 training]$ read value2 
-23 
-[trainee@centos8 training]$ [ $value1 -lt $value2 ] 
-[trainee@centos8 training]$ echo $? 
-1 
-[trainee@centos8 training]$ [ $value2 -lt $value1 ] 
-[trainee@centos8 training]$ echo $? 
-0 
-[trainee@centos8 training]$ [ $value2 -eq $value1 ] 
-[trainee@centos8 training]$ echo $? 
-1 
-</code> 
- 
-===Les opérateurs=== 
- 
-^ Test ^ Description ^ 
-| !expression | Retourne vrai si expression est fausse | 
-| expression1 -a expression2 | Représente un et logique entre expression1 et expression2 | 
-| expression1 -o expression2 | Représente un ou logique entre expression1 et expression2 | 
-| \(expression\) | Les parenthèses permettent de regrouper des expressions  | 
- 
-Testez si $file n'est pas un répertoire : 
- 
-<code> 
-[trainee@centos8 training]$ file=a1OO 
-[trainee@centos8 training]$ [ ! -d $file ] 
-[trainee@centos8 training]$ echo $? 
-0 
-</code> 
- 
-Testez si $directory est un répertoire **et** si l'utilisateur à le droit de le traverser : 
- 
-<code> 
-[trainee@centos8 training]$ directory=/usr 
-[trainee@centos8 training]$ [ -d $directory -a -x $directory ] 
-[trainee@centos8 training]$ echo $? 
-0 
-</code> 
- 
-Testez si l'utilisateur peut écrire dans le fichier a100 **et** /usr est un répertoire **ou** /tmp est un répertoire : 
- 
-<code> 
-[trainee@centos8 training]$ [ -w a100 -a \( -d /usr -o -d /tmp \) ] 
-[trainee@centos8 training]$ echo $? 
-0 
-</code> 
- 
-===Tests d'environnement utilisateur=== 
- 
-^ Test ^ Description ^ 
-| -o option | Retourne vrai si l'option du shell "option" est activée | 
- 
-<code> 
-[trainee@centos8 training]$ [ -o allexport ] 
-[trainee@centos8 training]$ echo $? 
-1 
-</code> 
- 
-====2.4 - La commande [[ expression ]]==== 
- 
-La commande **%%[[%%<key>espace</key>expression<key>espace</key>%%]]%%** est une amélioration de la commande **test**. Les opérateurs de la commande test sont compatibles avec la commande %%[[ expression ]]%% sauf **-a** et **-o** qui sont remplacés par **&&** et **%%||%%** respectivement : 
- 
-^ Test ^ Description ^ 
-| !expression | Retourne vrai si expression est fausse | 
-| expression1 %%&&%% expression2 | Représente un **et** logique entre expression1 et expression2 | 
-| expression1 %%||%% expression2 | Représente un **ou** logique entre expression1 et expression2 | 
-| %%(expression)%% | Les parenthèses permettent de regrouper des expressions  
- 
-D'autres opérateurs ont été ajoutés : 
- 
-^ Test ^ Description ^ 
-| string = modele | Retourne vrai si chaîne correspond au modèle | 
-| string != modele | Retourne vrai si chaîne ne correspond pas au modèle | 
-| string1 < string2 | Retourne vrai si string1 est lexicographiquement avant string2 | 
-| string1 > string2 | Retourne vrai si string1 est lexicographiquement après string2  | 
- 
-Testez si l'utilisateur peut écrire dans le fichier a100 **et** /usr est un répertoire **ou** /tmp est un répertoire : 
- 
-<code> 
-[trainee@centos8 training]$ [[ -w a100 && ( -d /usr || -d /tmp ) ]] 
-[trainee@centos8 training]$ echo $? 
-0 
-</code> 
- 
-====2.5 - Opérateurs du shell==== 
- 
-^ Opérateur ^ Description ^ 
-| Commande1 %%&&%% Commande2 | Commande 2 est exécutée si la première commande renvoie un code vrai | 
-| Commande1 %%||%% Commande2 | Commande 2 est exécutée si la première commande renvoie un code faux | 
- 
-<code> 
-[trainee@centos8 training]$ [[ -d /root ]] && echo "The root directory exists" 
-The root directory exists 
-[trainee@centos8 training]$ [[ -d /root ]] || echo "The root directory exists" 
-[trainee@centos8 training]$   
-</code> 
- 
-====2.6 - L'arithmétique==== 
- 
-===La commande expr=== 
- 
-La commande **expr** prend la forme : 
- 
-expr <key>espace</key> value1 <key>espace</key> //opérateur// <key>espace</key> value2 <key>entrée</key> 
- 
-ou 
- 
-expr <key>tab</key> value1 <key>tab</key> //opérateur// <key>tab</key> value2 <key>entrée</key> 
- 
-ou 
- 
-expr <key>espace</key> chaîne <key>espace</key> : <key>espace</key> //expression_régulière// <key>entrée</key> 
- 
-ou  
- 
-expr <key>tab</key> chaîne <key>tab</key> : <key>tab</key> //expression_régulière// <key>entrée</key> 
- 
-==Opérateurs Arithmétiques== 
- 
-^ Opérateur ^ Description ^ 
-| + | Addition | 
-| - | Soustraction | 
-| \* | Multiplication | 
-| / | Division | 
-| % | Modulo | 
-| \( \) | Parenthèses | 
- 
-==Opérateurs de Comparaison== 
- 
-^ Opérateur ^ Description ^ 
-| \< | Inférieur | 
-| %%\<=%% | Inférieur ou égal | 
-| \> | Supérieur | 
-| \>= | Supérieur ou égal | 
-| = | égal | 
-| != | inégal | 
- 
-==Opérateurs Logiques== 
- 
-^ Opérateur ^ Description ^ 
-| %%\|%% | ou logique | 
-| \& | et logique | 
- 
-Ajoutez 2 à la valeur de $x : 
- 
-<code> 
-[trainee@centos8 training]$ x=2 
-[trainee@centos8 training]$ expr $x + 2 
-4 
-</code> 
- 
-Si les espaces sont retirés, le résultat est tout autre : 
- 
-<code> 
-[trainee@centos8 training]$ expr $x+2 
-2+2 
-</code> 
- 
-Les opérateurs doivent être protégés : 
- 
-<code> 
-[trainee@centos8 training]$ expr $x * 2 
-expr: syntax error 
-[trainee@centos8 training]$ expr $x \* 2 
-4 
-</code> 
- 
-Mettez le résultat d'un calcul dans une variable : 
- 
-<code> 
-[trainee@centos8 training]$ resultat=`expr $x + 10` 
-[trainee@centos8 training]$ echo $resultat 
-12 
-</code> 
- 
-===La commande let === 
- 
-La commande let est l'équivalent de la commande %%((expression))%%. La commande %%((expression))%% est une amélioration de la commande **expr** : 
- 
-  * plus grand nombre d'opérateurs 
-  * pas besoin d'espaces ou de tabulations entre les arguments 
-  * pas besoin de préfixer les variables d'un $ 
-  * les caractères spéciaux du shell n'ont pas besoin d'être protégés 
-  * les affectations se font dans la commande 
-  * exécution plus rapide 
- 
-==Opérateurs Arithmétiques== 
- 
-^ Opérateur ^ Description ^ 
-| + | Addition | 
-| - | Soustraction | 
-| * | Multiplication | 
-| / | Division | 
-| % | Modulo | 
-| %%^%% | Puissance | 
- 
-==Opérateurs de comparaison== 
- 
-^ Opérateur ^ Description ^ 
-| < | Inférieur | 
-| %%<=%% | Inférieur ou égal | 
-| > | Supérieur | 
-| >= | Supérieur ou égal | 
-| == | égal | 
-| != | inégal | 
- 
-==Opérateurs Logiques== 
- 
-^ Opérateur ^ Description ^ 
-| && | et logique | 
-| %%||%% | ou logique | 
-| ! | négation logique | 
- 
-==Opérateurs travaillant sur les bits== 
- 
-^ Opérateur ^ Description ^ 
-| ~ | négation binaire | 
-| %%>>%% | décalage binaire à droite | 
-| %%<<%% | décalage binaire à gauche| 
-| & | et binaire | 
-| %%|%% | ou binaire | 
-| %%^%% | ou exclusif binaire | 
- 
-<code> 
-[trainee@centos8 training]$ x=2 
-[trainee@centos8 training]$ ((x=$x+10)) 
-[trainee@centos8 training]$ echo $x 
-12 
-[trainee@centos8 training]$ ((x=$x+20)) 
-[trainee@centos8 training]$ echo $x 
-32 
-</code> 
- 
-====2.7 - Structures de contrôle==== 
- 
-===If=== 
- 
-La syntaxe de la commande If est la suivante : 
- 
-<file> 
-if condition 
-then 
-    commande(s) 
-else  
-    commande(s) 
-fi 
-</file> 
- 
-ou : 
- 
-<file> 
-if condition 
-then 
-    commande(s) 
-    commande(s) 
-fi 
-</file> 
- 
-ou encore : 
- 
-<file> 
-if condition 
-then 
-     commande(s) 
-elif condition 
-then 
-     commande(s) 
-elif condition 
-then 
-     commande(s) 
-else  
-    commande(s) 
- 
-fi 
-</file> 
- 
-Créez le script **user_check** suivant : 
- 
-<code> 
-[trainee@centos8 training]$ vi user_check 
-[trainee@centos8 training]$ cat user_check 
-#!/bin/bash 
-if [ $# -ne 1 ] ; then 
-  echo "Mauvais nombre d'arguments" 
-  echo "Usage : $0 nom_utilisateur" 
-  exit 1 
-fi 
-if grep "^$1:" /etc/passwd > /dev/null 
-then 
-  echo "Utilisateur $1 est défini sur ce système" 
-else 
-  echo "Utilisateur $1 n'est pas défini sur ce système" 
-fi 
-exit 0 
-</code> 
- 
-Testez-le : 
- 
-<code> 
-[trainee@centos8 training]$ chmod 770 user_check 
-[trainee@centos8 training]$ ./user_check 
-Mauvais nombre d'arguments 
-Usage : ./user_check nom_utilisateur 
-[trainee@centos8 training]$ ./user_check root 
-Utilisateur root est défini sur ce système 
-[trainee@centos8 training]$ ./user_check mickey mouse 
-Mauvais nombre d'arguments 
-Usage : ./user_check nom_utilisateur 
-[trainee@centos8 training]$ ./user_check "mickey mouse" 
-Utilisateur mickey mouse n'est pas défini sur ce système 
-</code> 
- 
-===case=== 
- 
-La syntaxe de la commande case est la suivante : 
- 
-<file> 
-case $variable in 
-modele1) commande 
-   ... 
-   ;; 
-modele2) commande 
-   ... 
-   ;; 
-modele3 | modele4 | modele5 ) commande 
-   ... 
-   ;; 
-esac 
-</file> 
- 
-==Exemple== 
- 
-<code> 
-  case "$1" in 
-      start) 
-          start 
-          ;; 
-      stop) 
-          stop 
-          ;; 
-      restart|reload) 
-          stop 
-          start 
-          ;; 
-      status) 
-          status 
-          ;; 
-      *) 
-          echo $"Usage: $0 {start|stop|restart|status}" 
-          exit 1 
-esac 
-</code> 
- 
-<WRAP center round important 60%> 
-**Important** : L'exemple indique que dans le cas où le premier argument qui suit le nom du script contenant la clause **case** est **start**, la fonction //start// sera exécutée. La fonction //start// n'a pas besoin d'être définie dans **case** et est donc en règle générale définie en début de script. La même logique est appliquée dans le cas où le premier argument est **stop**, **restart** ou **reload** et **status**. Dans tous les autres cas, représentés par une étoile, **case** affichera la ligne **Usage: $0 {start|stop|restart|status}** où $0 est remplacé par le nom du script. 
-</WRAP> 
- 
-====2.8 - Boucles==== 
- 
-===for=== 
- 
-La syntaxe de la commande for est la suivante : 
- 
-<file> 
-for variable in liste_variables 
-do 
-    commande(s) 
-done 
-</file> 
- 
- 
-===while=== 
- 
-La syntaxe de la commande while est la suivante : 
- 
-<file> 
-while condition 
-do 
-    commande(s) 
-done 
-</file> 
- 
-==Exemple== 
- 
-<file> 
-U=1 
-while [ $U -lt $MAX_ACCOUNTS ] 
-do 
-useradd fenestros"$U" -c fenestros"$U" -d /home/fenestros"$U" -g staff -G audio,fuse -s /bin/bash 2>/dev/null 
-useradd fenestros"$U"$ -g machines -s /dev/false -d /dev/null 2>/dev/null 
-echo "Compte fenestros$U créé" 
-let U=U+1 
-done 
-</file> 
- 
-====2.8 - Scripts de Démarrage==== 
- 
-Quand Bash est appelé en tant que shell de connexion, il exécute des scripts de démarrage dans l'ordre suivant : 
- 
-  * **/etc/profile**, 
-  * **~/.bash_profile** ou **~/.bash_login** ou **~/.profile** selon la distribution, 
- 
-Dans le cas de RHEL/CentOS, le système exécute le fichier **~/.bash_profile**. 
- 
-Quand un shell de login se termine, Bash exécute le fichier **~/.bash_logout** si celui-ci existe. 
- 
-Quand bash est appelé en tant que shell interactif qui n'est pas un shell de connexion, il exécute le script **~/.bashrc**. 
- 
-<WRAP center round important 60%> 
-**A faire** : En utilisant vos connaissances acquises dans ce module, expliquez les scripts suivants ligne par ligne.  
-</WRAP> 
- 
-===~/.bash_profile=== 
- 
-<code> 
-[trainee@centos8 training]$ cat ~/.bash_profile 
-# .bash_profile 
- 
-# Get the aliases and functions 
-if [ -f ~/.bashrc ]; then 
- . ~/.bashrc 
-fi 
- 
-# User specific environment and startup programs 
-</code> 
- 
-===~/.bashrc=== 
- 
-<code> 
-[trainee@centos8 training]$ cat ~/.bashrc 
-# .bashrc 
- 
-# Source global definitions 
-if [ -f /etc/bashrc ]; then 
- . /etc/bashrc 
-fi 
- 
-# User specific environment 
-PATH="$HOME/.local/bin:$HOME/bin:$PATH" 
-export PATH 
- 
-# Uncomment the following line if you don't like systemctl's auto-paging feature: 
-# export SYSTEMD_PAGER= 
- 
-# User specific aliases and functions 
-</code> 
  
 ----- -----
 Copyright © 2024 Hugh Norris. Copyright © 2024 Hugh Norris.
Menu