Vezmeme-li v úvahu tyto otázky a odpovědi o pořadí provádění v prostředí, které se týká přesměrování, a navzdory skutečnosti, že pokud soubor neexistuje, vytvoří se jako první, takže cat example.txt | shuf > example.txt
nestěžuje si, že soubor neexistuje – což jen potvrzuje objednávku z toho, čemu rozumím – proč tedy asi jednou za tisíckrát v mém systému funguje náhodné přehrávání, když to udělám (záloha obsahuje 15 statických hodnot na jejich řádek)
for i in $(seq 1 1000); do
cp backup test
echo $i
cat test | shuf > test
cat test
done
Jak může zdánlivě existovat výjimka z pravidla?
Přijatá odpověď:
Zde:
cat test | shuf > test
>
má přednost v tom smyslu, že to znamená:
(cat test) | (shuf > test)
a ne:
(cat test | shuf) > test
I když kdybychom použili dva různé soubory, stejně by mezi těmito dvěma seskupeními nebyl žádný rozdíl.
Při použití stejného souboru je důležité, že se dva příkazy na obou stranách roury provádějí souběžně . Tyto příkazy jsou cat test
a shuf > test
. >
znamená „otevřeno pro zápis a zkrácení“, zatímco cat
se „otevře pro čtení“, přečte a zavře. Protože se tyto dvě věci dějí současně , vztah mezi pořadím jejich kolektivních operací je neurčitý . Existuje šance, že cat
dostane se k uskupení souboru, než shell spravující shuf > test
zkrátí to. Ale to je mizivá šance, protože jde o víc; stane se to pouze pokud cat
má velké štěstí ve vztahu k plánování shuf > test
.
Morálka příběhu: Nedělejte to – použijte místo toho dva soubory.