Здесь:
cat test | shuf > test
>
имеет приоритет в том смысле, что это означает:
(cat test) | (shuf > test)
и нет:
(cat test | shuf) > test
Хотя, если бы мы использовали два различных файла, не было бы никакого различия между этими двумя группировками так или иначе.
То, что становится значительным, когда Вы используете тот же файл, - то, что две команды по обе стороны от канала выполняются одновременно. Те команды cat test
и shuf > test
. >
означает "открытый для записи и усеченный", тогда как cat
собирается "открыться для чтения", читайте, и близко. Так как те две вещи происходят одновременно, отношения между порядком их коллективных операций неопределенны. Существует шанс это cat
доберется для прихлебывания файла в перед управлением оболочки shuf > test
усекает его. Но это - небольшой шанс, так как там более включен; это только произойдет если cat
очень удачно относительно планирования shuf > test
.
Мораль истории: не делайте это - использует два файла вместо этого.
http://lxr.free-electrons.com/source/fs/proc/loadavg.c#L13
http://lxr.free-electrons.com/source/kernel/sched/proc.c#L79