Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 07/05/2023, à 21:15

sputnick

eval is evil? Mais encore...

Salut,

j'ai une variable

subdir="subdir{1..5}/subdir{1..5}/subdir{1..5}/subdir{1..5}"

Comment puis-je créer la hiérarchie?

Cela me donne:

mkdir -p $subdir
tree
.
└── subdir{1..5}
    └── subdir{1..5}
        └── subdir{1..5}
            └── subdir{1..5}

(Je connais la réponse, c'est juste une discussion autour d'un sujet précis...).

Dernière modification par sputnick (Le 07/05/2023, à 22:32)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#2 Le 07/05/2023, à 22:21

soshy

Re : eval is evil? Mais encore...

eval mkdir -p "$subdir"

Mais si tu connais la réponse, je sais pas où tu veux en venir yikes

Hors ligne

#3 Le 07/05/2023, à 22:30

sputnick

Re : eval is evil? Mais encore...

Non, juste que dans certains cas précis, on a besoin d'

eval

.

Un autre exemple est

eval $(ssh-agent)

, on est obligé d'utiliser eval.

Juste mentionner qu'il ne faut pas utiliser eval dans un contexte où c'est un user random qui entre des entrées par read ou via CGI, car c'est un risque de sécurité. Il y a donc des cas où eval est légit'.

Autre chose, dans le même genre, mais moins connu, quand on traite des nombres en contexte arithmétique en bash, il peut aussi y avoir injection de code:

read -p 'Type an integer >>> ' x
Type an integer >>> a[$(date >&2)]+42
((x++))
dim. 07 mai 2023 23:29:49 CEST

Voir https://www.vidarholen.net/contents/blog/?p=716


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#4 Le 08/05/2023, à 07:44

soshy

Re : eval is evil? Mais encore...

C'est la base de ce qu'on apprend en informatique:
- ne jamais faire confiance aux input user
- valider que les saisies utilisateur sont conformes à ce qu'on attend

Et éviter (car il y a parfois des cas legit) d'exécuter la saisie de l'utilisateur directement. Dans un autre domaine, ça donne les injections sql.

Dernière modification par soshy (Le 08/05/2023, à 07:44)

Hors ligne

#5 Le 09/05/2023, à 16:59

Watael

Re : eval is evil? Mais encore...

sputnick a écrit :

j'ai une variable

subdir="subdir{1..5}/subdir{1..5}/subdir{1..5}/subdir{1..5}"

Comment puis-je créer la hiérarchie?

là, on quitte le domaine du simple codage, et on aborde le méta-codage, où le langage "s'auto-programme".

Évidemment, les recommandations qui s'appliquent au codage ne peuvent plus s'appliquer à la méta-programmation.

j'ai une variable

subdir="subdir{1..5}/subdir{1..5}/subdir{1..5}/subdir{1..5}"

si je devais en arriver là, c'est que je serais allé trop loin, et je rétro-pédalerais pour chercher comment faire autrement.

Dernière modification par Watael (Le 09/05/2023, à 17:13)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 10/05/2023, à 02:07

sputnick

Re : eval is evil? Mais encore...

Dans certains cas, quand il n'y a pas d'interactions avec les utilisateurs, on peut très bien utiliser eval.

Cela évite d'inutiles complication.

Faut juste savoir s'en servir proprement, c'est comme un couteau.

On n'interdit pas les couteaux, pourtant, ça tue des gens.

Si on interdit eval, il faut aussi interdire les calculs arithmétiques si on a pas assainit ('sanitized' plus parlant en Anglais) les entrées.

C'est le même souci que les injections SQL.


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#7 Le 10/05/2023, à 04:08

Watael

Re : eval is evil? Mais encore...

on n'interdit pas, on prévient son utilisation.

On n'interdit pas les couteaux, pourtant, ça tue des gens.

si, si. le port d'un couteau (catégorie D) est interdit sans motif légitime.
En gros, porter un couteau, c'est mal. big_smile

et puis, on ne donne pas un couteau acéré et aiguisé à un enfant avant qu'il ait acquis certaines compétences.
En gros, un couteau, c'est dangereux, et donc c'est mal. lol

quant aux "inutiles complications" : « l'important, ce n'est pas la destination, c'est le voyage. » smile

pour les évaluations arithmétiques, bash peut typer des entiers.

« autre chose ? je peux ?... »


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 10/05/2023, à 04:26

sputnick

Re : eval is evil? Mais encore...

De la rhétorique tout ça. Je dit juste qu'il faut savoir l’utiliser, à bon escient. Certes pas pour tout et n'importe quoi.

Que veut tu dire par typer des entiers ?

Il n'y pas pas moins typé que le shell, en tout cas bash, en l'espèce.


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#9 Le 10/05/2023, à 04:32

Watael

Re : eval is evil? Mais encore...

$ declare -i x
$ x=foo
$ echo $x
0
$

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#10 Le 10/05/2023, à 04:37

sputnick

Re : eval is evil? Mais encore...

Wé, c'est un bon moyen de récupérer une entrée utilisateur quand on s'attend à un entier et pas autre chose:

declare -i var
read -p 'Entrer un entier >>> ' var
echo $var

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#11 Le 12/05/2023, à 00:39

sputnick

Re : eval is evil? Mais encore...

Cette discussion est tellement dérisoire à coté de ce que ChatGPT change... tongueroll

Je lui demande:

Given a Python Selenium 'WebElement' element 'images', generate a list comprehension to get all 'src' attributes

Réponse:

src_list = [img.get_attribute('src') for img in images]

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#12 Le 12/05/2023, à 07:14

diesel

Re : eval is evil? Mais encore...

Ouairf..., il a donné le code.

Watael, en plus, il t'explique pourquoi. tongue

Amicalement.

Jean-Marie


Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.

Hors ligne

#13 Le 12/05/2023, à 07:52

bruno

Re : eval is evil? Mais encore...

sputnick a écrit :

, generate a list comprehension to get all 'src' attributes

Oui c'est vrai que c'est étonnant cette capacité de chatGPT à comprendre du mauvais anglais lol

Blague à part quel rapport avec le sujet initial ?

Hors ligne

#14 Le 13/05/2023, à 03:24

sputnick

Re : eval is evil? Mais encore...

En fait, l'utilisation de

declare -i

est considéré par les pro de bash comme n'étant pas fiable.

Exemple:

$ declare -i x; y=z; z=10+30; read x <<<'y'; declare -p x
declare -i x="40"

Une manière fiable de faire des tests sur les entrées utilisateur: https://mywiki.wooledge.org/BashFAQ/054

Cette page est LA référence en matière de bash et de bonnes pratiques.


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#15 Le 13/05/2023, à 03:43

Watael

Re : eval is evil? Mais encore...

En fait, l'utilisation de

declare -i

est considéré par les pro de bash comme n'étant pas fiable.

donne tes sources.
parce que faire de telles assertions et renvoyer vers d'autres "vérités", ça c'est de la rhétorique.

que x fasse l'évaluation arithmétique ne me choque pas, je fais souvent x+=1 en ayant déclaré x comme nombre.
ce qui me chagrine, c'est le passage de "variables" y=z et read x <<<'y'


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#16 Le 13/05/2023, à 08:29

bruno

Re : eval is evil? Mais encore...

sputnick a écrit :

En fait, l'utilisation de

declare -i

est considéré par les pro de bash comme n'étant pas fiable.

C'est parfaitement fiable pour ce que c'est censé faire : s'assurer que la variable ainsi définie soit bien évaluée comme un entier dans la suite du script. Ce n'est pas destiné à vérifier ou à valider les entrées des utilisateurs.

Hors ligne

#17 Le 13/05/2023, à 13:49

sputnick

Re : eval is evil? Mais encore...

bruno a écrit :

C'est parfaitement fiable pour ce que c'est censé faire : s'assurer que la variable ainsi définie soit bien évaluée comme un entier dans la suite du script. Ce n'est pas destiné à vérifier ou à valider les entrées des utilisateurs.

Dans ce cas on est d'accord.

Pour une vraie vérification:

case "$x" in
    '' | *[!0123456789]*)
        printf '%s\n' "$0: $x: invalid digit" >&2; exit 1;;
esac

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#18 Le 13/05/2023, à 14:45

Tawal

Re : eval is evil? Mais encore...

Hello,


Je suis surpris que [0-9] et [:digit:] peuvent contenir autre chose que des chiffres selon les locales !
Je comprends pour les langues "graphiques" (chinois, arabe ...).
Mais pour les langues "occidentales" ?


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#19 Le 26/05/2023, à 14:39

Postmortem

Re : eval is evil? Mais encore...

Tawal a écrit :

Je suis surpris que [0-9] et [:digit:] peuvent contenir autre chose que des chiffres selon les locales !

Salut,
Que « [0-9] » contienne autre chose que des chiffres, je pige pas...
Par contre, pour « [:digit:] », je me dis que c'est pas délirant dans le cas où on est en hexadécimal (sauf si tu inclus déjà les "lettres/chiffres" dans ce que tu appelles chiffres ! tongue )


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#20 Le 26/05/2023, à 15:23

bruno

Re : eval is evil? Mais encore...

Tawal a écrit :

Je suis surpris que [0-9] et [:digit:] peuvent contenir autre chose que des chiffres selon les locales !

Un exemple ?

Tawal a écrit :

Je comprends pour les langues "graphiques" (chinois, arabe ...).
Mais pour les langues "occidentales" ?

C'est quoi des langues graphiques ? Toute langue écrite est forcément graphique…
Que je sache toutes les langues utilisent maintenant le  système de numération indo-arabe.

Postmortem a écrit :

Par contre, pour « [:digit:] », je me dis que c'est pas délirant dans le cas où on est en hexadécimal (sauf si tu inclus déjà les "lettres/chiffres" dans ce que tu appelles chiffres ! tongue )

Dans la norme POSIX [:digit:] correspond strictement à [0-9] et pour l'hexadécimal on a [:xdigit:] qui correspond strictement à [0-9A-Fa-f] (Réf.)

Dernière modification par bruno (Le 26/05/2023, à 15:24)

Hors ligne

#21 Le 26/05/2023, à 15:43

Postmortem

Re : eval is evil? Mais encore...

bruno a écrit :

Dans la norme POSIX [:digit:] correspond strictement à [0-9] et pour l'hexadécimal on a [:xdigit:] qui correspond strictement à [0-9A-Fa-f] (Réf.)

J'avais oublié « [:xdigit:] », merci !
Mais sinon, je faisais juste une supposition, ne comprenant pas trop comment « [0-9] » pouvait matcher autre chose que des chiffres.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#22 Le 26/05/2023, à 15:49

sputnick

Re : eval is evil? Mais encore...

Postmortem, je pense que tu a mal suivi.

Le code

' | *[!0123456789]*)
      ^
  negation

N’autorise que les digits. Pas un espace, pas une lettre.

Tout est dans la négation: !

Dernière modification par sputnick (Le 26/05/2023, à 15:51)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#23 Le 26/05/2023, à 16:51

Postmortem

Re : eval is evil? Mais encore...

@sputnick,oui oui, je répondais par rapport au message de Tawal :

Tawal a écrit :

Je suis surpris que [0-9] et [:digit:] peuvent contenir autre chose que des chiffres selon les locales !

Je comprends qu'il dit que « [0-9] » pourrait sortir autre chose que des chiffres. D'où mon interrogation/suggestion.


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#24 Le 26/05/2023, à 17:58

LeoMajor

Re : eval is evil? Mais encore...

salut,
ramener au contexte declare -i x, et regex [[ ]], natif au bash
1/ cela signifie que x  n'est pas un vrai integer, mais juste un string qui ressemble à un integer.
Un regex attend en stdin/input un string mais certainement pas un vrai integer/float ..., qui retourne une erreur de typage, sémantique.

2/declare -i  est en contradiction avec printf '%d' $x
$ declare -i a="chocolat"; declare -p a
declare -i a="0"

le bash n'est ni un langage déclaratif, ni typé, ni objet.
Il ne sait pas faire d'inférence, auto c++/ variant /équivalence python.

à adapter
cat ./declarei.bash

#!/bin/bash
#Type mismatch: wanted Integer, got anything: Semantic Error

stopit() {
father=$(ps h -o ppid -p $$)
if [ -n "$father" ]; then
    kill -s SIGINT $$ -term "$father"
else
    kill -term $$
fi
}

if [ $# -ne  1 ]; then echo  "one argument only or missing" >&2; stopit; fi
tmp=$(sed 's/^"//;s/"$//' <<<"$1")
printf '%d' $tmp &>/dev/null ||  { echo  "Type mismatch: wanted Integer" >&2; stopit;}
declare -i ret # ne sert strictement à rien
ret=$(printf '%d' $tmp &2>/dev/null)
echo -n "$ret"
exit 0
while true; do read -rp "A quel âge peut-on vôter ? " age; [ $(./declarei.bash "$age") -ge 18 ] && echo "ok" || echo "ko"; done 

Hors ligne

#25 Le 26/05/2023, à 18:05

Watael

Re : eval is evil? Mais encore...

koi?! comment, mais kOa !?
une regex attend ce qu'elle déclare·
une chaîne n'est pas un nombre, et en tant que nombre une chaîne vaut 0·

oulala! les codeurs ne sont pas des programmeurs. pfff, le vieux troll!


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne