(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.