Si j'essaie de rediriger la sortie de i obtenir le message d'erreur grep code> dans le même fichier qu'il lise, comme:
GREP: fichier d'entrée 'fichier.txt' est également la sortie code>. Comment
grep code> déterminez-le? P> p>
4 Réponses :
Selon le code source GNU Grep, le Le grep code> Vérifiez les nœuds I de l'entrée et de la sortie:
OUT_STAT code> est rempli par appelant
fstat code> contre
stdout_fileno code>. p>
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.
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;
}
Voici comment écrire à certains fichiers:
Essayez le pipeline avec CAT ou TAC:
cat file | grep 'searchpattern' > newfile