Shell

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

Shell

par Rockleader » 01 Oct 2013, 16:29

Hello, j'aimerais quelques informations quand aux redirection dans le shell de linux.


Je ne pense pas pouvoir avoir des infos là dessus avec un man.


Admettons ls affiche la liste des fichiers et dessiers de mon rep courant

mail adresse < fichiers.txt

envoie le fichiers à l'adresse.

Maintenant j'aimerais, par exemple envoyer l'affichage du ls dans un fichier.

Tout ça bien sur en une seule ligne, est ce possible avec des redirections ? Ou Du genre rediriger la sortie ls de stdout sur un fichier.txt en stdin donc ???

Auquel cas comment vas t'on le lier avec la commande de mail ?

Que se passe t'il si fichier.txt n'existe pas; faut il le créer au préalable ?
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Benjamin
Membre Complexe
Messages: 2337
Enregistré le: 14 Avr 2008, 10:00

par Benjamin » 03 Oct 2013, 21:32

Salut,

avec > fichier tu rediriges en écrasant le fichier si déjà existant et le créant si il n'existe pas.

avec >> fichier, tu écris à la suite du fichier si il existe déjà, sinon ça le crée tout seul.

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 03 Oct 2013, 21:54

Bonjour Rokleader,
C'est un peu curieux cette question, soit cela résulte d'un besoin précis, soit cela correspond à un oubli.
Le man, c'est une chose utile, les bouquins, c'est une chose indispensable.
Bonne soirée.

Iroh
Membre Relatif
Messages: 374
Enregistré le: 14 Oct 2008, 19:24

par Iroh » 03 Oct 2013, 22:12

Salut, une explication en français pour les redirections en bash: http://man.cx/bash%281%29/fr#heading15

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 05 Oct 2013, 11:57

Merci à tous pour vos conseils ! J'ai également eu plus d'infos là dessus avec mes cours merci !

Dlzlogic a écrit:Bonjour Rokleader,
C'est un peu curieux cette question, soit cela résulte d'un besoin précis, soit cela correspond à un oubli.
Le man, c'est une chose utile, les bouquins, c'est une chose indispensable.
Bonne soirée.


Le man c'est gratuit; les bouquins c'est payant :zen:

Ok je pourrais concéder d'en acheter un; mais si je devais faire ça pour chacun de mes sujets de cours hein...il y a des choix à faire je pense.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 05 Oct 2013, 12:32

Le man c'est gratuit; les bouquins c'est payant

Ok je pourrais concéder d'en acheter un; mais si je devais faire ça pour chacun de mes sujets de cours hein...il y a des choix à faire je pense.
Je ne pense pas que le man soit un support de cours, et en tout cas, je suis presque sûr qu'il se contente de décrire les fonctions.
J'ai un tas de bouquins autour de moi et à portée de main, pourtant j'ai fais un peu d'ordre il n'y a pas longtemps, tu crois que je m'y prends mal ?

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 05 Oct 2013, 14:22

Dlzlogic a écrit:Je ne pense pas que le man soit un support de cours, et en tout cas, je suis presque sûr qu'il se contente de décrire les fonctions.
J'ai un tas de bouquins autour de moi et à portée de main, pourtant j'ai fais un peu d'ordre il n'y a pas longtemps, tu crois que je m'y prends mal ?


Est ce que j'ai dis que c'était mal ?

J'ai seulement dit qu'il fallait faire des choix; pour ma part je ne peux pas me permettre d'extra; entre la bouffe et le loyer ça laisse pas grand chose pour des "bouquins"; maintenant si tu m'en offres je dirais pas non hein...

Cdlt.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 05 Oct 2013, 15:30

hello,

ca sert à rien d'acheter un bouquin sur comment marche linux.
tu as toutes les ressources nécessaires sur le net.

Le man c'est bien, mais c'est pas ce qu'il y a de plus plaisant à lire, fort heureusement sur le net ya pas mal de tuto. Si tu cherches les stream redirections pour linux, tu trouves plethores d'articles.
la vie est une fête :)

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 08 Oct 2013, 17:46

Petite question quant au métacaractère; certains comme * ont deux significations.

* peut être une chaine de caractère quelconque.
* peut être une répétition (n fois ?) du caractère précédent.



Donc comment le shell fera il la différence ? Ou bien les métacaractère du shell ne s'utilisent que dans le shell; ou le second qui est un métacaractère des expressions régulières s'utiliserait dans un script ?

Mon cours ne donne pas de précision là dessus.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 08 Oct 2013, 18:28

c'est comme le +.
Ca peut servir d'addition.
Ca peut servir de répétition de caractères.

Ca dépend quand tu l'utilises...
en shell, c'est un joker, ca prend tout.
En regex c'est la répétition 0,infini d'une occurrence.

ps: normalement regx c'est regular expression ou expression rationnelle
la vie est une fête :)

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 08 Oct 2013, 18:35

On dit pas plutôt "expression régulière" ?

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 08 Oct 2013, 18:42

Dlzlogic a écrit:On dit pas plutôt "expression régulière" ?



C’est ce que j'ai dans mon cours en tout cas.


Dans ce cas là, si je vois une seule ligne de code: grep 'e*'

Comment puis je savoir si le shell va comprendre affiche une chaîne commençant par e et suivi de n'importe quoi; ou bien affiche une chaîne étant une répétition de e.

Je veux bien que cela serve au deux; mais si on place ça dans un script et qu'on ne sait pas comment le shell va le prendre...
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 08 Oct 2013, 18:47

grep --help
man grep

et tu peux aussi tester.
la vie est une fête :)

Dlzlogic
Membre Transcendant
Messages: 5273
Enregistré le: 14 Avr 2009, 12:39

par Dlzlogic » 08 Oct 2013, 18:58

Bonsoir,
Un script, c'est un fichier texte qui contient des instructions.
Ce script est lu par un programme qui lit les lignes les unes après les autres et exécute les instructions au fur et à mesure.
C'est l'exemple type du programme interprété.
Comme tout programme, celui-là exécute l'instruction de la façon que l'auteur a décidé et précisé quelque-part.
En shell, comme dans tout autre langage, il y a une syntaxe et une logique. Cela ne s'invente pas, c'est écrit quelque-part, il y a des cours comportant des explications, et des aides-mémoire, sous forme généralement cartonnée, que l'on garde à portée de main. Je dois avoir cet aide-mémoire sur UNIX (==Linux) et VI, mais comme je ne travaille plus que sous Windows, je peux pas te renseigner.

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 08 Oct 2013, 19:03

linux != unix. premier lien
la vie est une fête :)

Benjamin
Membre Complexe
Messages: 2337
Enregistré le: 14 Avr 2008, 10:00

par Benjamin » 08 Oct 2013, 19:23

Salut,

Quelque trucs qui pourront t'aider.
Quand le shell lie une ligne, il l'interprète. C'est à dire qu'il découpe la ligne sur les blancs pour obtenir une liste de mots.
Le premier mot est toujours un programme/script à appeler (qui doit être dans un des endroit de la variable $PATH (sauf à l'appeler explicitement) et posséder les droits x (sauf à utiliser sh mon_fichier)). Le reste des mots sont des paramètres.

Dans les paramètres, le shell interprète certains metacaractère. Il fait de la substitution de variables (les $qqch sont remplacés par leur valeur), et génère des noms à l'aide de *, ?, caractère entre crochet etc.. (on appelle cela remplacement, ou globbing).

Maintenant, il y a quelques règles à l'interprétation. Tout ce qui est entre ' ' n'est jamais interprété ni globbé. Ainsi, quand tu écrit grep 'e*', le shell passe le paramètres e* à grep sans l'avoir interprété.

Les blancs entre " " ne sont pas interprété (c'est à dire qu'il n'y a pas de découpe en plusieurs paramètres) et les globs non plus, mais les variables si.

Entre ``, les variables et les glob fonctionne. Tu peux donc faire
Code: Tout sélectionner
for fichier in `ls *.txt`
Ici, le * est le caractère spécial de remplacement. Si tu ne veux pas qu'il soit interprété par le shell et passé à ls en tant que * (je ne suis pas sûr qu'on ait le droit de mettre une * dans un nom de fichier mais c'est pour l'exemple), il faut le protéger avec un \, ou le mettre entre ' '.

A+

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 08 Oct 2013, 22:58

Ayant mal écrit mon exemple; je vais le remettre en plus clair


Si j'écris


grep "e\*" < fich.txt


Entre " " le caractère \ est bien interprété; donc il protège *

Ce qui faut que le grep va nous afficher les lignes du fichier fich.txt qui

1- commenceront par un e et seront suivi de n'importe quelle chaine de caractère (qui peut être vide)?
2- seront constitué d'une suite de e (c'est à dire 1 ou plus) ?

Au final ça reviendra au même on aura le me^me affichage car une suite de e sera cnsidéré comme n'importe quelle chaine de caractère; et au final ça marche pareil (sauf si le e est le dernier carac du fichier).

Auquel cas; comment sait on la façon dont le code est interprété; vu qu'il y a deux façon possible ?
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Benjamin
Membre Complexe
Messages: 2337
Enregistré le: 14 Avr 2008, 10:00

par Benjamin » 09 Oct 2013, 12:37

Rockleader a écrit:Ayant mal écrit mon exemple; je vais le remettre en plus clair


Si j'écris


grep "e\*" < fich.txt


Entre " " le caractère \ est bien interprété; donc il protège *

Bien interprété par qui ? Entre " ", le shell n'interprète \ comme un caractère de protection uniquement placé devant $ pour ne pas faire la substitution de variables et devant ` pour ne pas faire de l'interprétation de commande (et bien sûr, devant \ lui-même si il ne sert pas à échaper le caractère suivant, comme dans \\$mot, qui revient à chercher \toto si $mot = 'toto').

Ici, c'est donc la regex e\* qui est appliqué pour chercher les lignes du fichier. Soit un e suivi d'une *.

Ce qui faut que le grep va nous afficher les lignes du fichier fich.txt qui

1- commenceront par un e et seront suivi de n'importe quelle chaine de caractère (qui peut être vide)?
2- seront constitué d'une suite de e (c'est à dire 1 ou plus) ?


Voir ci-dessus : aucun des 2. Les \ protège l'étoile dans le regex interprété par grep, puisque entre " ", le shell n'interprète de toute façon pas l'étoile.

Au final ça reviendra au même on aura le me^me affichage car une suite de e sera cnsidéré comme n'importe quelle chaine de caractère; et au final ça marche pareil (sauf si le e est le dernier carac du fichier).

Auquel cas; comment sait on la façon dont le code est interprété; vu qu'il y a deux façon possible ?

Au final, si tu fais effectivement grep "e*", il va te sortir toutes les lignes où la lettre e apparait consécutivement, 0, 1 ou un nombre infini de fois. C'est à dire toutes les lignes. Il n'y a aucune question à se poser en fait. Dans une regex, * = le caractère précédent répété un nombre indéfini de fois, dont 0. C'est donc ton option 2 précédente qui s'applique, à la petite erreur prêt que 0 compte. Si tu veux faire 1 ou plus, il faut utiliser +.

Par contre, subtilité du + (et aussi du ?), quand tu utilises les regex standard (mode par défaut de grep), le + disparait dans l'interprétation de grep. Il faut donc faire grep "e\+". Mais là, c'est uniquement une spécificité de grep.

Tu peux utiliser l'option -E de grep pour utiliser les regex étendues, et alors, le + est bien interprété : grep -E "e+".

De manière générale, je recommande de toujours utiliser les ' ' plutôt que les " " sauf si c'est absolument nécessaire. Ca évite en général de se poser des questions.

A+

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 09 Oct 2013, 17:12

Ok merci beaucoup pour ton aide et tes conseils; utiliser les ' plutot que " est aussi le conseil donné par notre professeur.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 22 Oct 2013, 16:21

Bonsoir,

cette fois j'aimerais quelques conseils en ce qui concerne les scripts en sh (bourne shell)

Lorsque l'on veut donner un nom à un script; on peut enregistrer en appelant le fichier script.sh

Je sais que le paramètre $0 est censé être le nom du script.
Donc par défaut est ce que sans enregistrer avec un nom précis on peut directement mettre le nom du script dans le paramètre $0. Avec la commande set par exemple ?

Merci.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite