Teniendo en cuenta estas preguntas y respuestas sobre el orden de ejecución en el shell en relación con la redirección, y a pesar del hecho de que si un archivo no existe, se crea primero para que cat example.txt | shuf > example.txt
no se queja de que el archivo no existe, lo que simplemente confirma el orden por lo que entiendo, entonces, ¿por qué aproximadamente una vez cada mil veces en mi sistema, la reproducción aleatoria funciona cuando hago esto (la copia de seguridad contiene 15 valores estáticos cada uno en su línea)
for i in $(seq 1 1000); do
cp backup test
echo $i
cat test | shuf > test
cat test
done
¿Cómo puede haber aparentemente una excepción a la regla?
Respuesta aceptada:
Aquí:
cat test | shuf > test
>
tiene prioridad en el sentido de que esto significa:
(cat test) | (shuf > test)
y no:
(cat test | shuf) > test
Aunque si usáramos dos archivos diferentes, no habría ninguna diferencia entre estas dos agrupaciones de todos modos.
Lo que se vuelve significativo cuando usa el mismo archivo es que los dos comandos a cada lado de la tubería se ejecutan simultáneamente . Esos comandos son cat test
y shuf > test
. >
significa "abierto para escribir y truncar", mientras que cat
va a "abrir para lectura", leer y cerrar. Dado que esas dos cosas están sucediendo concurrentemente , la relación entre el orden de sus operaciones colectivas es indeterminada . Existe la posibilidad de que cat
podrá sorber el archivo antes de que el shell administre shuf > test
lo trunca. Pero esa es una pequeña posibilidad, ya que hay más involucrados; solo sucederá si cat
tiene mucha suerte en relación con la programación de la prueba shuf > test
.
Moraleja de la historia: No hagas esto, usa dos archivos en su lugar.