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).

    ;-))
    0
    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 ?
      0
      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
        0
        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.
          0
          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

            ;-))
            0