2015-02-08 2 views

Antwort

8

Gemäß dem grep Quellcode GNU, überprüfen die grep den i-Knoten von dem Eingang und dem Ausgang:

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 = 1; 
     goto closeout; 
    } 

Die out_stat durch Aufruf fstat gegen STDOUT_FILENO gefüllt ist.

if (fstat (STDOUT_FILENO, &tmp_stat) == 0 && S_ISREG (tmp_stat.st_mode)) 
    out_stat = tmp_stat; 
+0

Vielen Dank für die Antwort, ich vergessen, wie die Shell setzt tatsächlich den Prozess der Datei-Deskriptoren vorher und dass grep Informationen über diese überprüfen können. – iobender

+0

@iobender, Gern geschehen. – falsetru

2

auf den Quellcode der Suche - können Sie sehen, dass es für diesen Fall überprüft (die Datei bereits geöffnet ist für das Lesen von grep) und meldet sie, finden Sie in der SAME_INODE Prüfung unter:

/* 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; 
    } 
2

hier ist, wie zu einem gewissen Datei schreiben zurück:

grep stuff file.txt > tmp && mv tmp file.txt 
0

try pipline mit Katze oder tac:

cat file | grep 'searchpattern' > newfile 

es am besten Praxis und kurz ist für die Realisierung

Verwandte Themen