Como a ordem de execução no shell, no que se refere ao redirecionamento, pode ser perturbada por volta de 1 hora de um 1000 no meu sistema? [duplicado]

3

Considerando este Q & Um sobre a ordem de execução no shell, no que se refere ao redirecionamento, e apesar do fato de que, se um arquivo não existir, ele será criado primeiro, para que cat example.txt | shuf > example.txt não reclame que o arquivo não existe exist - o que apenas confirma a ordem pelo que entendi - então por que é que uma vez a cada mil vezes no meu sistema o shuffle funciona quando eu faço isso (o backup contém 15 valores estáticos cada na linha deles)

for i in $(seq 1 1000); do
    cp backup test
    echo $i
    cat test | shuf > test
    cat test
done

Como pode aparentemente haver uma exceção à regra ?

    
por jus cogens prime 23.01.2014 / 10:16

1 resposta

3

Aqui:

cat test | shuf > test

> tem precedência no sentido de que isso significa:

(cat test) | (shuf > test) 

e não:

(cat test | shuf) > test

Embora se usássemos dois arquivos diferentes, não haveria nenhuma diferença entre esses dois agrupamentos de qualquer maneira.

O que se torna significativo quando você usa o mesmo arquivo é que os dois comandos em ambos os lados do canal são executados simultaneamente . Esses comandos são cat test e shuf > test . > significa "aberto para escrita e truncamento", enquanto cat vai "abrir para leitura", ler e fechar. Como essas duas coisas estão acontecendo simultaneamente , a relação entre a ordem de suas operações coletivas é indeterminada . Há uma chance de que cat consiga fazer o slurp antes de o shell gerenciar shuf > test o truncar. Mas essa é uma pequena chance, já que há mais envolvimento; Isso só acontecerá se cat tiver muita sorte em relação ao agendamento de shuf > test .

Moral da história: Não faça isso - use dois arquivos.

    
por 23.01.2014 / 10:58