IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Probleme de redirection


Sujet :

Linux

  1. #1
    Membre habitué Avatar de arnaud036
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 201
    Points : 172
    Points
    172
    Par défaut Probleme de redirection
    Salut,

    J'ai une question a propos du fonctionnement du Shell.

    Pourquoi la redirection suivante ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat file.txt | sed 's/abc/xyz/' > file.txt
    Lorsque j'affiche mon fichier file.txt il est vide ! Pourquoi ?

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par arnaud036 Voir le message
    Salut,

    J'ai une question a propos du fonctionnement du Shell.

    Pourquoi la redirection suivante ne fonctionne pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat file.txt | sed 's/abc/xyz/' > file.txt
    Lorsque j'affiche mon fichier file.txt il est vide ! Pourquoi ?
    Parce que le shell, en analysant ta ligne, a détecté une redirection. Et il commence alors par préparer le terrain en créant le container vide prêt à recevoir le résultat => ton fichier est alors vidé avant d'être traité

    Si tu veux faire ça, il existe une astuce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    exec 3<file.txt
    rm -f file.txt
    cat 0<&3 | sed -e "s/abc/xyz/" > file.txt
    1) on commence par créer un buffer numéroté associé au fichier. Ainsi, le canal 3 contient les datas du fichier

    2) on efface le fichier afin de dissocier son nom de son contenu. C'est impératif. Si on ne le faisait pas, le nom "file.txt" serait toujours associé à son contenu et vider "file.txt" viderait son contenu.
    Inversement, si on l'efface, ça libère le nom "file.txt" qui disparait du répertoire et qui peut donc être réutilisé. Et le contenu d'origine est toujours présent, mais maintenant associé au canal 3

    3) on traite le canal 3 (le contenu initial) et on écrit les datas dans un nouveau fichier "file.txt".

    Accessoirement, le cat est inutile. Autant éviter de générer des processus pour rien...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/abc/xyz/" 0<&3 >file.txt

  3. #3
    Membre habitué Avatar de arnaud036
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 201
    Points : 172
    Points
    172
    Par défaut
    Merci pour cette explication et cette solution

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 782
    Points
    23 782
    Par défaut
    Sur la plupart des UNIX, au moins GNU et BSD libres, il existe surtout l'option -i (inplace) qui sert à cela. Mais il est toujours bon de savoir comment gérer les flux d'une manière générale.

    sed -i 's/abc/xyz/' file.txt

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Sur la plupart des UNIX, au moins GNU et BSD libres, il existe surtout l'option -i (inplace) qui sert à cela. Mais il est toujours bon de savoir comment gérer les flux d'une manière générale.

    sed -i 's/abc/xyz/' file.txt
    Mouais. Je ne connaissais pas. Mais présenté comme ceci, il semblerait que l'option "-i" n'a été mise en place que dans le sed.
    Et donc si le pb avait eu lieu sur une commande "awk" ou "tr" on aurait pas pu l'utiliser non ?
    C'est toujours bon à savoir bien entendu. Mais je préfère ma solution qui a l'avantage d'être portable et d'être adaptable à tout programme de traitement et à laquelle je me suis habitué

    C'est comme en Python. Pendant des années, j'ai simulé le ternaire de la façon suivante: var=booléen and v1 or v2 (dangereux si v1 vaut 0) et j'ai découvert récemment une syntaxe plus adaptée var=v1 if booléen else v2 (fiable à 100%).
    Ben j'ai énormément de mal, quand je dois mettre un ternaire, à utiliser la seconde expression...

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 782
    Points
    23 782
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Mouais. Je ne connaissais pas. Mais présenté comme ceci, il semblerait que l'option "-i" n'a été mise en place que dans le sed.
    Et donc si le pb avait eu lieu sur une commande "awk" ou "tr" on aurait pas pu l'utiliser non ?
    Non, et c'est bien ce que je dis. Les commandes UNIX ne sont déjà que moyennement portables d'un UNIX à l'autre, alors « sed -i » l'est encore moins. Mais c'est tellement pratique et fréquent que cette option est de plus en plus répandue.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 290
    Points : 426
    Points
    426
    Par défaut
    Pour éviter ce genre de souci, il peut être bon d'utiliser perl en ligne...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de redirection
    Par ribrok dans le forum Langage
    Réponses: 5
    Dernier message: 26/10/2005, 16h50
  2. [HTML] petit probleme de redirection
    Par discogarden dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 14/06/2005, 15h25
  3. [ servlet ] probleme de redirection
    Par felix79 dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 13/09/2004, 14h08
  4. Probleme de redirection apres fermeture de session
    Par soufienne dans le forum ASP
    Réponses: 3
    Dernier message: 08/04/2004, 10h52
  5. [VB6] probleme de redirection d'une commande DOS
    Par WriteLN dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/06/2003, 09h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo