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 : 22173
Sam 11 Nov 2017 04:31
Message Re: Notes sur le Bourne Shell des UNIX
À la section 2.13.3, sur les expression régulière du shell pour l’expansion des noms de fichiers, on découvre des détails sur des choses qu’on ne remarque pas, parce qu’elles produisent les résultats qu’on attend intuitivement sans y penser, mais pas vraiment toujours.

La barre oblique doit être l’objet d’une correspondance exacte. Elle ne peut pas apparaitre dans ce qui ressemblerait à un ensemble de caractère, parce que ça n’en serait plus un. Il ne faut par exemple pas écrire quelque chose comme “ […/…] ”, car le résultat ne serait pas celui attendu. L’astérisque, “ * ” et le point d’interrogation, “ ? ”, ne correspondent jamais à la barre oblique ; par exemple si “ * ” peut correspondre à “ machin ”, il ne peut pas correspondre “ machin/bidule ”.

Il en va de même avec le point au début d’un nom d’élément (nom de fichier, de répertoire, etc), qui doit être l’objet d’une correspondance exacte. Par exemple si “ * ” peut correspondre à “ machin ”, mais ne peut pas correspondre à “ .machin ”, alors que “ .* ” pourra correspondre à ce dernier.

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 : 22173
Sam 11 Nov 2017 04:46
Message Re: Notes sur le Bourne Shell des UNIX
À la section 2.14, on apprend que les commandes prédéfinies break et continue, peuvent prendre un paramètre entier, optionnel, désignant la boucle englobante sur laquelle s’applique la commande. Quand cet argument n’est pas donné, il vaut 1 par défaut.

Exemple :

Code : 

# N’entrera pas dans une boucle infinie.
while true; do # Niveau 2
while true; do # Niveau 1
break 2
done
done

# N’entrera pas dans une boucle infinie.
L="a b c d"
for X in $L; do # Niveau 2
while true; do # Niveau 1
continue 2
done
done

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 : 22173
Sam 11 Nov 2017 05:13
Message Re: Notes sur le Bourne Shell des UNIX
La commande prédéfinie return peut être utilisée pour retourner d’un fichier sourcé (sourcé avec la commande dot, le point), pas seulement pour retourner d’une fonction.

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 : 22173
Sam 11 Nov 2017 05:20
Message Re: Notes sur le Bourne Shell des UNIX
La commande prédéfinie unset si elle reçoit l’option -f, peut être utilisée pour oublier la définition d’une fonction, pas seulement d’une variable. Pour supprimer une variable, on peut utiliser l’option -v, qui ne nécessite pas d’être explicite, car c’est l’option par défaut.

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 : 22173
Sam 11 Nov 2017 14:44
Message Re: Notes sur le Bourne Shell des UNIX
La commande prédéfinie, trap, ne renvoit pas de statut, ne modifie pas la valeur de “ $? ”. Si après trap, “ $? ” vaut autre chose que “ 0 ”, ça ne signifie pas que trap a échoué, ça signifie que la commande précédente à échouée.

“ EXIT ” ou “ 0 ” est un pseudo‑signal qui peut être passé comme condition à trap. Cette constante n’existe pas dans “ signal.h ”, elle est spécifique à trap.

Quand un signal est passé à trap par son nom plutôt que par sa valeur numérique (le nom me semble plus recommandé que la valeur numérique), il doit l’être sans le préfixe “ SIG ” avec lequel il apparait dans “ signal.h ” (le préfixe “ SIG ” reste nécessaire en C).

L’action passée à trap, n’est pas nécessairement une fonction, ça peut être une chaîne de caractères. L’argument donné pour l’action, est exécuté avec la commande prédéfinie eval (ce que le shell fait implicitement).

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 : 22173
Sam 11 Nov 2017 18:49
Message Re: Notes sur le Bourne Shell des UNIX
La commande prédéfinie, set, peut être utilisée avec des noms d’option plus verbeux, plus lisibles que les options à une lettre. Il faut alors utiliser la syntaxe “ set -o nom ” pour activer une option.

Exemple :

Code : 

set -o errexit  # Comme set -e, mais plus lisible.


La spécification ne le dit pas, mais dans mon implémentation de Sh, il est possible de désactiver une option avec une syntaxe similaire, en remplaçant “ -o nom ” par “ +o nom ”, même s’il peut sembler contre‑intuitif d’utiliser un signe « + » pour désactiver une option. La spécification mentionne bien “ +o ”, mais sans argument de nom d’option. Dans ce cas, la commande renvoi une liste des options sous une forme directement réutilisable pour remettre ultérieurement les options dans leurs état actuel. C’est en lançant cette commande, “ set +o ”, que j’ai put constater que “ set +o nom ” est une invocation valide avec l’implémentation de Sh que j’utilise.

Exemple :

Code : 

# Pratique, voir incontournable, mais non‑portable !
set +o errexit # Inverse de set -o errexit.

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 : 22173
Mer 15 Nov 2017 13:52
Message Re: Notes sur le Bourne Shell des UNIX
La section 2.7 dit explicitement que quand plusieurs redirections sont présentes pour une commande, elles sont interprétées dans l’ordre, de gauche à droite.

La section 2.7.5 sur les redirections avec le symbole « & », rappel qu’elles introduisent une copie de descripteur.

Le mot « copie » doit être souligné, car il explique pourquoi les redirections multiples peuvent ne pas fonctionner pas comme prévue selon l’ordre dans lequel elles apparaissent.

Exemple :

Code : 

# Affiche un message sur stderr.
$ date -
> date: date incorrecte «-»

# Affiche toujours un message sur le terminal.
$ date - 2>&1 1>/dev/null
> date: date incorrecte «-»

# N‘affiche plus de message d’erreur.
$ date - 1>/dev/null 2>&1


Le premier cas est un cas de base pour les deux suivants.

Dans le second cas, le descripteur 2 est une copie du descripteur 1. Puis le descripteur 1 est redirigé vers le néant. Mais le descripteur 2 est une copie de 1 avant que 1 ne soit redirigé vers le néant. Il en est une copie quand il est dirigé vers le terminal. C’est ce qui explique qu’un message d’erreur est toujours affiché sur le terminal.

Dans le troisième cas, 1 est redirigé vers le néant, puis 2 devient une copie de 1, qui a été préalablement redirigé vers le néant, donc 2 est redirigé vers le néant.

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 : 22173
Mer 15 Nov 2017 14:07
Message Re: Notes sur le Bourne Shell des UNIX
Les caractères de commande avec la barre inverse, comme “ \n ”, ne sont pas interprété par Sh, même si certaines commandes peuvent les interpréter.

Exemple :

Code : 

$ NL="
"
$ S="\n"
$ test "$NL" = "$S"
$ echo $?
> 1


NL est une variable ne contenant qu’un saut de ligne. S est une variable ne contenant que “ \n ”, et NL n’est pas égal à S.

Second exemple :

Code : 

$ /bin/echo "A\nB"
> A\nB

$ /bin/echo -e "A\nB"
> A
> B


Dans le premier cas, le texte affiché contient un “ \n ”, littéralement. Ce n’est pas une surprise en vertu de ce qui a été expliqué précédemment.

Dans le second cas, l’option “ -e ” est donnée, qui enjoint “ /bin/echo ” d’interpréter les caractères échappés. Ce n’est pas Sh qui interprète “  \n ”, c’est la commande echo.

Dans cet exemple, j’ai utilisé “ /bin/echo ” et non‑pas “ echo ” tout court, parce que ce dernier désigne la commande prédéfinie de Sh, qui ne se comporte pas exactement comme “ /bin/echo ”, ce qui peut être source de confusion, notamment en faisant croire à tord que Sh interprète les caractères échappés.

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 : 22173
Jeu 16 Nov 2017 02:57
Message Re: Notes sur le Bourne Shell des UNIX
La section 2.9.1 précise que les assignations de variable, sont des éléments composant les commandes simples. Une assignation de variable, seule, est une commande, qui donc modifie le statut de la dernière commande. Ça peut ressembler à un piège si on y prend pas garde.

Exemple :

Code : 

$ truc() return 1
$ truc
$ echo $?
> 1

$ truc
$ A=Machin
$ echo $?
> 0


Notez comme dans le deuxième cas, “ $? ” ne représente plus le statut d’exécution de la commande “ truc ”, mais le statut d’exécution de “ A=Machin ”.

En particulier, ceci ne peut que ne pas fonctionner comme prévu :

Code : 

STATUS=$?
if [ $? -ne 0 ]; then
echo "Erreur : $STATUS." >&2
fi


La condition ne sera jamais vraie.

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 : 22173
Jeu 11 Jan 2018 08:39
Message Re: Notes sur le Bourne Shell des UNIX
La section 2.3.1, rappel que la substitution des alias a lieu immédiatement après l’analyse lexicale. Contrairement aux fonctions, les alias sont évalués immédiatement, on ne peut donc pas les définir plus loin.

Exemple :

Code : 

# OK
$ alias abc="echo 'ABC'"
$ truc () { abc; }
$ truc
> ABC


Code : 

# Ne marchera pas
$ truc () { abc; }
$ alias abc="echo 'ABC'"
$ truc
> sh: 1: abc: not found


Dans le deuxième exemple volontairement erroné, si abc était défini comme une fonction, il n’y aurait pas d’erreur :

Code : 

# Maintenant OK
$ truc () { abc; }
$ abc () { echo "ABC"; }
$ truc
> ABC

Image
Hibou57

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