Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 30-03-2014 09:36:35

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

[résolu]shell et caractères spéciaux ;; |

Bonjour,
J'ai quelques problèmes avec la classification des caractères spéciaux que j'ai trouvé dans notre wiki, et dans bien d'autres documentations.

D'abord, à propos du symbole | : j'ai compris qu'il s'agit du pipe et qu'il sert à enchaîner les commandes
( une commande, envoie un flux de données à une autre commande qui filtre ce qu'elle reçoit et le transforme ).
Du coup je comprends que | fasse partie des opérateurs de redirection.

Mais ce qui pose problème c'est qu'on trouve le symbole | à la fois dans la liste des opérateurs de redirection (< > > | « » <& >& «- <> )   mais aussi dans la liste des opérateurs de contrôle qui servent à séparer deux commandes ou deux listes (& && () {} ; ;; | || ).

Je me suis d'abord dit que le pipe était à la fois un opérateur de contrôle et de redirection (et qu'il s'agissait du même symbole dans les deux listes). Est-ce cela ? Ou s'agit-il de l'évocation d'un autre usage du signe |   ?
Le signe | de la liste des opérateurs de contrôle, c'est quand même pas un "ou inclusif binaire" , l'opérateur booléen de C ?
Si oui comment s'utilise-t-il  pour qu'il ne soit pas pris pour un pipe par le shell ?

Enfin je ne comprends  pas pourquoi ";" fait partie de la liste, je le connais seulement comme syntaxe qui va avec case ! J'ai beau cherché je n'ai pas trouvé d'autres usages ?

Grand merci d'avance smile

Dernière modification par Hypathie (31-03-2014 08:09:10)

Hors ligne

#2 30-03-2014 10:08:36

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : [résolu]shell et caractères spéciaux ;; |

Plop,
Mhh, je ne sais pas trop d'où vient cette délimitation sur le wiki, mais je te confirme qu'il n'y a pas différentes sémantiques de | en shell. En particulier, il n'a pas le même sens qu'en C.
Donc, euh, pour la redirection, on trouve :

echo "coucou" > fichier
echo "plop" >> fichier
cat < fichier
cat << DELIM
bla
DELIM

echo "plop" | cat
find /proc 1>fichiers.log 2>erreurs.log
find /proc 1>tout.log 2>&1


Donc: « > » (=« 1> »), « 2> », « >> » (=« 1>> »), « 2>> », « < » (=« 0< »), « << » (=« 0<< »), « X>&Y » (=rediriger le flux X dans le flux Y), « | ».

Le reste : « ( ) ; ;; && || » ne sont pas des opérateurs de redirection de flux.
Mais bon, je pense que d'un certain point de vue, les opérateurs de redirection sont des opérateurs de contrôle… Je ne suis pas sûr que cette terminologie soit officielle.

Et que dire de $() et `` ?

echo $(cat fichier)
echo `cat fichier`


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#3 30-03-2014 13:24:50

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]shell et caractères spéciaux ;; |

Merci captnfab  smile

Donc comme cela se serait plus clair :

1) opérateurs de direction :      >     >>    <    <<    >&    |

2) les caractères d'enchaînement de commandes :     &    &&    ( )    { }    ;    ||

Et est-ce que je peux modifier le wiki en y mettant ces 1) et 2) à la place de ce qui y est (lien de mon #1) ?

Pour   $(  )    et   `     `  :   j'ai lu quelque part que c'était des mots réservés du shell ?   big_smile

Hors ligne

#4 30-03-2014 13:37:00

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : [résolu]shell et caractères spéciaux ;; |

Les opérateurs de redirection de flux et d'enchaînement de commandes sont eux aussi réservés au shell.

Oui, tu peux mettre à jour le wiki smile

Mais j'aurais tendance à rajouter «$()» quelque part. C'est un peu de la redirection de flux aussi, sauf que ça transforme un flux dynamique, non limité en chaîne de caractères statique, de longueur limitée. Donc ça nécessite que la commande entre () se termine, donc c'est plutôt de l'enchaînement de commandes que de l'enchaînement de flux…

Peut-être à placer en 3) Exécution «en-ligne» de commandes ? Avec un titre moins malhonnêtement ambiguë. tongue

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#5 31-03-2014 08:08:35

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]shell et caractères spéciaux ;; |

J'ai trouvé d'où vient ma confusion.

Dans un autre contexte que l'enchaînement de commandes, il semble que le shell "reconnaisse" certains booléens, enfin je m'le comprends comme ça big_smile

Ici par exemple il me semble qu'il s'agit bien d'un "OU" (binaire ? logique ?)  :


#!/bin/bash
read -p "Votre nom est-il $USER ? " reponse
case $reponse in
o|O ) echo "Bonjour $USER" ;;
*) echo "créez un compte utilisateur" ;;
esac
 



On dirait que certains ont fait le choix de mettre les éléments syntaxiques de la commande composée "case" dans un groupe de caractères qu'ils nomment "opérateurs de contrôle ".
Ça peut se comprendre pour ";;" qui sépare les instructions, mais pour " | " qui sépare des chaînes, c'est carrément bizarre !!!

C'est encore plus "malhonnêtement ambiguë " tongue

Dernière modification par Hypathie (31-03-2014 13:14:05)

Hors ligne

#6 31-03-2014 12:58:11

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : [résolu]shell et caractères spéciaux ;; |

Plop,

Hum, en effet, « ;; » et « | » ont un sens particulier dans le « case ».

Le « | » a bien le sens du « ou inclusif » et le « ;; » du « break » en C.

Une grammaire (récursive) simplifiée pour la règle « case » est la suivante :

case CHAINE in
 CAS
esac



Avec

CAS := FILTRES) COMMANDES ;; [CAS]
FILTRES := FILTRE [ | FILTRES]
FILTRE := CHAINESANSESPACE ou "CHAINE"
COMMANDES := COMMANDE [ ; COMMANDES]



Et où COMMANDE désigne n'importe quelle commande tappable dans le shell. smile


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#7 31-03-2014 13:15:22

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : [résolu]shell et caractères spéciaux ;; |

polp ! smile

Hors ligne

Pied de page des forums