Piszę aplikację, która działa jak filtr: odczytuje dane wejściowe z pliku (stdin), przetwarza i zapisuje dane wyjściowe do innego pliku (stdout). Plik wejściowy zostanie całkowicie odczytany, zanim aplikacja rozpocznie zapisywanie pliku wyjściowego.Używanie tego samego pliku dla stdin i stdout z przekierowaniem
Ponieważ używam stdin i stdout, mogę uruchomić to tak:
$ ./myprog <file1.txt >file2.txt
To działa dobrze, ale gdy próbuję użyć tego samego pliku jako wejścia i wyjścia (czyli: czytaj z pliku i zapisu do tego samego pliku), jak poniżej:
$ ./myprog <file.txt >file.txt
czyści file.txt
zanim program ma szansę, aby ją przeczytać.
Czy jest jakiś sposób mogę zrobić coś takiego w linii poleceń w systemie Unix?
Dziwne. Dlaczego '$ (./myprog> file.txt)
TheoYou
Twój przykład robi to, ponieważ '> plik.txt' obcina zawartość pliku.txt i jest to nawiasem mówiąc ten sam plik, z którego odczytuje plik' plik.txt' tworzy nowy * plik * (inny i-węzeł na tej samej ścieżce), który jest oddzielny od tego, z jakiego '
antak
Więc wszystko, co musimy zrobić, to sami uruchomić sub-powłokę. Myślę, że znam odpowiedź, ale nadal nie jestem pewna, dlaczego ... – TheoYou