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.
|
|
Auteur | Message |
---|---|
Administrateur
|
— 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. Hibou57 « La perversion de la cité commence par la fraude des mots » [Platon] |
|
|
Administrateur
|
À 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).
Hibou57 « La perversion de la cité commence par la fraude des mots » [Platon] |
Administrateur
|
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.
Hibou57 « La perversion de la cité commence par la fraude des mots » [Platon] |
Administrateur
|
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). Hibou57 « La perversion de la cité commence par la fraude des mots » [Platon] |
Administrateur
|
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 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. Hibou57 « La perversion de la cité commence par la fraude des mots » [Platon] |
Administrateur
|
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. 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. Hibou57 « La perversion de la cité commence par la fraude des mots » [Platon] |
Administrateur
|
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 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 ! 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 Hibou57 « La perversion de la cité commence par la fraude des mots » [Platon] |
Administrateur
|
À 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 ! Hibou57 « La perversion de la cité commence par la fraude des mots » [Platon] |
Administrateur
|
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. (*) 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. Hibou57 « La perversion de la cité commence par la fraude des mots » [Platon] |
Administrateur
|
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\`` 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)) Hibou57 « La perversion de la cité commence par la fraude des mots » [Platon] |
|