(2 odpovědi)
Uzavřeno před 2 lety.
Vím, že se jedná o jakýsi duplikát jiné otázky (Proč mi tento příkaz řazení dává prázdný soubor?), ale chtěl jsem otázku rozvést v reakci na uvedené odpovědi.
Příkaz
shuf example.txt > example.txt
Vrátí prázdný soubor, protože shell soubor před zamícháním zkrátí a ponechá pouze prázdný soubor k náhodnému promíchání. Nicméně,
cat example.txt | shuf > example.txt
vytvoří zamíchaný soubor podle očekávání.
Proč metoda potrubí funguje, když jednoduché přesměrování nefunguje? Pokud je soubor před spuštěním příkazů zkrácen, neměla by druhá metoda také ponechat prázdný soubor?
Přijatá odpověď:
Problém je v tom, že > example.txt
začne zapisovat do tohoto souboru před shuf example.txt
začne to číst. Takže zatím nebyl žádný výstup, example.txt
je prázdné, shuf
přečte prázdný soubor a jako shuf
v tomto případě neprovede žádný výstup, konečný výsledek zůstane prázdný.
Váš druhý příkaz může trpět stejným problémem. > example.txt
může zabít soubor před cat example.txt
začne to číst; záleží na pořadí, v jakém shell tyto věci provádí, a na tom, jak dlouho to trvá cat
skutečně otevřít soubor.
Chcete-li se těmto problémům zcela vyhnout, můžete použít shuf example.txt > example.txt.shuf && mv example.txt.shuf example.txt
.
Nebo můžete použít shuf example.txt --output=example.txt
místo toho.