Shell

與重定向相關的 shell 中的執行順序如何在我的系統上的 1000 次中被擾亂約 1 次?

  • June 11, 2020

考慮到這個關於shell中執行順序的問答,因為它與重定向有關,儘管事實上如果一個文件不存在,它會首先創建,這樣cat example.txt | shuf > example.txt就不會抱怨文件不存在——這只是確認我理解的順序 - 那麼為什麼在我的系統上大約每千次洗牌在我這樣做時起作用(備份在他們的行上每個包含 15 個靜態值)

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

這條規則怎麼可能有例外?

這裡:

cat test | shuf > test

>在這個意義上優先,這意味著:

(cat test) | (shuf > test) 

並不是:

(cat test | shuf) > test

雖然如果我們使用兩個不同的文件,無論如何這兩個分組之間不會有任何區別。

當您使用同一個文件時,重要的是管道兩側的兩個命令同時執行。這些命令是cat testshuf > test>表示“為寫入而打開並截斷”,而cat將“為讀取而打開”、讀取和關閉。由於這兩件事情是同時發生的,所以它們集體操作的順序之間的關係是不確定的。有機會在 shell 管理截斷cat文件之前將文件吞入其中。shuf > test但這是一個很小的機會,因為涉及的更多;只有catshuf > test. _

**故事的寓意:**不要這樣做——改用兩個文件。

引用自:https://unix.stackexchange.com/questions/110563