Hello!

Inspiré(e) de prendre part à la discussion ? Ou de poser une question ou demander de l’aide ?

Alors bienvenues dans les grands sujets des forums de La Bulle : m’inscrire.

Cette partie du forum n’est pas compatible avec les bloqueurs publicitaires

Félicitations à vous, de préférer les accès payants plutôt que la gratuité par la publicité, c’est honnorable et cohérent de votre part. Malheureusement, l’accès payant par micropaiement (qui serait d’environ 1 cent pour 20 pages consultées) n’est pour l’instant pas encore mis en place, et l’accès gratuit sans publicité, est réservé aux membres actif(ve)s du forum. En attendant, si vous souhaitez poursuivre votre visite chez nous, vous pouvez ajouter le site à votre liste blanche, ou encore mieux, désactiver le bloqueur partout. Pour ajouter le site à votre liste blanche, pour Firefox (similaire pour les autres navigateurs), rendez‑vous en bas à gauche de la fenêtre de votre navigateur, et cliquez sur le menu comme dans l’exemple de l’image ci‑dessous, puis rechargez la page, en appuyant sur F5.

Notes sur le Bourne Shell des UNIX
Auteur Message
Administrateur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 16764
Sam 23 Sep 2017 11:20
Message Notes sur le Bourne Shell des UNIX
— Note de l’administration : ce sujet est initialement né du sujet « UNIX, POSIX et SUS : références et à‑propos ». Fin de la note —

Quelques astuces et notes pour l’usage du shell standard d’UNIX, qui est Sh, et non‑pas Bash, il faut le rappeler (pour les scripts au moins, cependant pour les sessions interactives c’est différent) : Rich’s sh — POSIX shell — tricks (etalabs.net).

J’aime bien une phrase qu’il écrit en préambule :
L’auteur a écrit : 
I am a strong believer that Bourne-derived languages are extremely bad, on the same order of badness as Perl, for programming, and consider programming sh for any purpose other than as a super-portable, lowest-common-denominator platform for build or bootstrap scripts and the like, as an extremely misguided endeavor.

Image
Hibou57

« La perversion de la cité commence par la fraude des mots » [Platon]
Profil Site Internet
Administrateur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 16764
Dim 22 Oct 2017 06:38
Message Re: Notes sur le Bourne Shell des UNIX
À la suite du précédent message, une page sur la délicate question des mises entre guillemets dans le shell Sh (Bourne Shell) : A guide to Unix shell quoting (resources.mpi-inf.mpg.de).

Image
Hibou57

« La perversion de la cité commence par la fraude des mots » [Platon]
Profil Site Internet
Administrateur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 16764
Mar 24 Oct 2017 15:11
Message Re: Notes sur le Bourne Shell des UNIX
Une liste d’erreurs courantes à ne pas commettre avec le shell Sh : Shell mistakes (greenend.org.uk). Attention : cette page mentionne un bashisme vers la fin (une chose spécifique à Bash) qui n’est pas applicable à Sh.

Image
Hibou57

« La perversion de la cité commence par la fraude des mots » [Platon]
Profil Site Internet
Administrateur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 16764
Ven 3 Nov 2017 20:29
Message Re: Notes sur le Bourne Shell des UNIX
Le shebang n’est pas une fonctionnalité de POSIX, même s’il est en usage sur tous les UNIX et similaires : Shell Command Language (opengroup.org), 2016.
Le document a écrit : 
If the first line of a file of shell commands starts with the characters "#!", the results are unspecified.


Les auteurs du standard ont le shebang à l’esprit, mais ce qu’il fait n’est pas spécifié par le standard. Le shebang est un standard de fait, mais pas un standard.

S’il ne vient pas de POSIX, il vient bien du monde des UNIX. Pour son histoire, voir : #! - the Unix truth as far as I know it (homepages.cwi.nl/~aeb).

Image
Hibou57

« La perversion de la cité commence par la fraude des mots » [Platon]
Profil Site Internet
Administrateur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 16764
Dim 5 Nov 2017 12:40
Message Re: Notes sur le Bourne Shell des UNIX
Le symbole dièse, #, ne délimite un commentaire que s’il est le premier caractère de la ligne ou est précédé d’un blanc, sinon il est un caractère ordinaire dans un mot et fait parti du mot.

Un exemple a tester pour illustrer :

Code : 

$ echo ABCD#EFGH
> ABCD#EFGH

$ echo ABCD #EFGH
> ABCD


Dans le premier cas, le caractère # fait parti du mot commencé par «ABCD  », dans le second cas, il délimite un commentaire.

Ce n’est pas un bug des implémentations de Sh, c’est une conséquence de la spécification POSIX : Shell Command Language (opengroup.org), dans la section 2.3, figure une liste de 10 étapes, … lisez attentivement les points 8 et 9 dans l’ordre et vous comprendrez.

Image
Hibou57

« La perversion de la cité commence par la fraude des mots » [Platon]
Profil Site Internet
Administrateur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 16764
Dim 5 Nov 2017 21:32
Message Re: Notes sur le Bourne Shell des UNIX
De la même source que dans le précédent message (le standard) à la section 2.5.1, on apprend que la syntaxe la plus connue pour accéder à un paramètre par sa position, ne doit s’utiliser que pour les positions de 1 à 9 (0 ne désigne pas un paramètre, mais ça s’applique aussi), car si l’index a plus qu’un unique digit, il faut le mettre entre accolades.

Exemple :

Code : 

$1     # Correct.
$10 # Incorrect !
${10} # Correct.


Les accolades peuvent aussi être utilisées quand il n’y a qu’un seul digit. On peut le préférer pour des raisons d’uniformité :

Code : 

${1}   # Correct.

Image
Hibou57

« La perversion de la cité commence par la fraude des mots » [Platon]
Profil Site Internet
Administrateur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 16764
Lun 6 Nov 2017 12:38
Message Re: Notes sur le Bourne Shell des UNIX
De la même source qu’avant, à la section 2.6.1, on apprend que le tilde, s’il est collé à un mot qui le suit, ce mot peut être interprété comme un nom d’utilisateur, et l’expansion de ce préfixe constitué par le tilde et le mot, est le répertoire de l’utilisateur désigné. Pour rappel, le tilde n’est reconnu que quand il est en préfixe et seulement si ce préfixe n’est pas entre guillemets (qu’ils soient simples ou doubles) ; mais attention, 2.6.2 rappel que l’expansion du tilde a lieu aussi pendant une expansion de paramètre avec substitution, le tilde pouvant y être en préfixe même si ça n’en a pas l’air visuellement, comme dans ${XYZ:=~}.

Dans l’exemple ci‑dessous, remplacez « moi » par votre nom d’utilisateur :

Code : 

$ echo ~moi
> /home/moi

$ # Même chose que :
$ echo ~
> /home/moi

$ # Avec un autre nom d’utilisateur :
$ echo ~root
> /root


Si l’utilisateur n’existe pas, la spécification dit que le résultat n’est pas défini (variable selon les implémentations). Dans l’implémentation de Sh que j’utilise, le résultat de l’expansion est le préfixe lui‑même, inchangé :

Code : 

$ # Non‑portable !
$ echo ~xyz
> ~xyz


Le préfixe, c’est le tilde et le mot jusqu’à la prochaine barre oblique s’il y en a une :

Code : 

$ echo ~moi/Répertoire
> /home/moi/Répertoire

Image
Hibou57

« La perversion de la cité commence par la fraude des mots » [Platon]
Profil Site Internet
Administrateur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 16764
Lun 6 Nov 2017 13:02
Message Re: Notes sur le Bourne Shell des UNIX
À la section 2.6, on apprend que le symbole $, s’il est utilisé comme littéral, devrait être échappé, car s’il n’est pas utilisé pour ses fonctions spéciales et n’est pas échappé, le résultat n’est pas défini, même si par exemple l’implémentation de Sh que j’utilise, l’affiche alors comme littéral.

Exemple :

Code : 

$ # Non‑portable !
$ echo $
> $

$ # Mieux vaut ainsi :
$ echo \$
> $

Image
Hibou57

« La perversion de la cité commence par la fraude des mots » [Platon]
Profil Site Internet
Administrateur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 16764
Lun 6 Nov 2017 20:17
Message Re: Notes sur le Bourne Shell des UNIX
La section 2.6.3 dit que le texte produit par une substitution de commande ( $(…) ), est nettoyé de ses éventuels espaces et sauts de ligne à la fin. C’est ainsi que quand on récupère le contenu d’un fichier texte depuis un script Sh avec la commande cat par exemple, et que ce fichier texte contient des lignes vides à la fin, ces lignes vides disparaissent du texte reçu (*). Ce n’est pas un bug, c’est la spécification qui l’exige.

Un exemple :

Code : 

$ echo "ABCD\n\n\n"  # Affiche des lignes vides.
> ABCD
>
>
>
$ echo "$(echo "ABCD\n\n\n")" # N’affiche pas de lignes vides.
> ABCD


(*) Il existe une astuce pour les préserver, mais pour rester simple, ce ne sera pas présenté ici, peut‑être à une autre occasion.

Cela ne s’applique pas aux éventuels sauts de ligne et espaces se trouvant ailleurs :

Code : 

$ echo "$(echo "ABCD\n\n\nE")"  # Affiche des lignes vides avant E.
> ABCD
>
>
> E

Image
Hibou57

« La perversion de la cité commence par la fraude des mots » [Platon]
Profil Site Internet
Administrateur
Avatar de l’utilisateur
  • Genre : Télétubbie
  • Messages : 16764
Lun 6 Nov 2017 22:50
Message Re: Notes sur le Bourne Shell des UNIX
Le caractère d’échappement doit être l’objet de quelques attentions.

La section 2.6.3 de la référence du langage du shell, dit que les substitutions de commande de la forme `…`, peuvent être imbriquées, et qu’elles sont imbriquées en « échappant » les caractères « ` » délimitant les commandes imbriquées.

Exemple :

Code : 

$ echo `ls -l \`which cat\``
> -rwxr-xr-x 1 root root 51036 mars 2 2017 /bin/cat


C’est un faux échappement, c’est en fait un syntaxe trompeuse. Une bonne raison de préférer la syntaxe $(…), pour les substitutions de commande, comme cette syntaxe permet des imbrications plus lisibles :

Code : 

$ echo $(ls -l $(which cat))
> -rwxr-xr-x 1 root root 51036 mars 2 2017 /bin/cat

Image
Hibou57

« La perversion de la cité commence par la fraude des mots » [Platon]
Profil Site Internet