Shell : redirection de fichier

Résolu
Bonjour à tous,

Il y a quelque chose qui m'échappe depuis un moment déjà : pourquoi, lorsqu'on redirige la sortie d'une opération d'un fichier sur lui même, le fichier s'efface-t-il ?

Par exemple :

sort monfichier > monfichier


Merci d'avance à ceux qui répondront ou juste liront ce message.

6 réponses

  1. Contributeur
    Salut,

    Parce que ">" redirige la sortie standard vers un fichier (et l'écrase par conséquence).
    Alors que ">>" redirige la sortie standard vers un fichier en concaténant le tout (ajout).

    ;-))
    1. Merci pour votre réponse.

      Jusque là je comprends.

      Ce que je ne comprends pas c'est pourquoi le fichier devient vide après ce type de commande.
      Si il y a redirection de la sortie standard alors monfichier devrait contenir le résultat de la commande, hors il est vide et toutes les données sont perdues.

      Plus précisement, hier je cherchais à remplacer tous les sauts de ligne d'un fichier par des espaces.
      Comme je n'y arrivais pas avec sed j'ai utilisé tr.
      J'ai essayé cette commande :

       cat monFichier | tr -s '\n' ' ' > monFichier


      mais elle ne donne rien.
      J'ai du ****** quelque part.

      Avez vous une idée ?
      1. Contributeur
        La redirection (en sortie) vers le fichier d'entrée n'est jamais souhaitable ;-((

        Avec "sed" :

        sed  -i.bak ':z;N;$! bz;s/\n/ /g'  fichier
        1. D'accord, c'est noté.
          Je vais l'écrire en rouge au dessus de mon lit.

          En tout cas la commande marche, je n'ai plus qu'à la comprendre maintenant.

          Merci beaucoup zipe31.

          À bientôt pour de nouvelles aventures.
          1. Contributeur
            :z
            Étiquette

            N
            On ajoute la ligne suivante dans l'espace de travail

            $ !b z
            Dernière ligne du fichier ($) différente (!) ? On se branche (b) à l'étiquette (:z) et on recommence...

            s/\n/ /g
            Quand on a atteint la dernière ligne, on exécute la substitution, à savoir : remplacer toutes (g) les fins de ligne (\n) par un espace

            ;-))