7
votes

Comment Grep sait-il qu'il écrit au fichier d'entrée?

Si j'essaie de rediriger la sortie de grep dans le même fichier qu'il lise, comme: xxx

i obtenir le message d'erreur GREP: fichier d'entrée 'fichier.txt' est également la sortie . Comment grep déterminez-le?


0 commentaires

4 Réponses :


8
votes

Selon le code source GNU Grep, le grep Vérifiez les nœuds I de l'entrée et de la sortie: XXX

Le OUT_STAT est rempli par appelant fstat contre stdout_fileno . xxx


1 commentaires

Merci pour la réponse, j'ai oublié comment la coquille configure en réalité les descripteurs de fichiers du processus à l'avance et que le GREP pouvait vérifier les informations sur ces.



2
votes

Regarder le code source - Vous pouvez voir qu'il vérifie que ce cas (le fichier est déjà ouvert pour la lecture par grep code>) et le signale, voir le même_inode code> Vérifiez ci-dessous:

  /* If there is a regular file on stdout and the current file refers
     to the same i-node, we have to report the problem and skip it.
     Otherwise when matching lines from some other input reach the
     disk before we open this file, we can end up reading and matching
     those lines and appending them to the file from which we're reading.
     Then we'd have what appears to be an infinite loop that'd terminate
     only upon filling the output file system or reaching a quota.
     However, there is no risk of an infinite loop if grep is generating
     no output, i.e., with --silent, --quiet, -q.
     Similarly, with any of these:
       --max-count=N (-m) (for N >= 2)
       --files-with-matches (-l)
       --files-without-match (-L)
     there is no risk of trouble.
     For --max-count=1, grep stops after printing the first match,
     so there is no risk of malfunction.  But even --max-count=2, with
     input==output, while there is no risk of infloop, there is a race
     condition that could result in "alternate" output.  */
  if (!out_quiet && list_files == 0 && 1 < max_count
      && S_ISREG (out_stat.st_mode) && out_stat.st_ino
      && SAME_INODE (st, out_stat))
    {
      if (! suppress_errors)
        error (0, 0, _("input file %s is also the output"), quote (filename));
      errseen = true;
      goto closeout;
    }


0 commentaires

2
votes

Voici comment écrire à certains fichiers: xxx


0 commentaires

0
votes

Essayez le pipeline avec CAT ou TAC:

    cat file | grep 'searchpattern' > newfile


0 commentaires