我正在嘗試創建一個 Bash 腳本來使用不同的程序計算大檔案的 MD5 校驗和。我了解到應該&為此目的使用。
同時,我想在不同的變數中捕獲校驗和的結果,并將它們寫入檔案以便之后讀取它們。因此,我撰寫了以下腳本“test_base.sh”并使用命令“sh ./test_base.sh”執行它,并將結果發送到以下為空的檔案“test.txt”。
我的作業系統是 LUBUNTU 22.04 LTS。
為什么“test.txt”是空的?
“test_base.sh”的代碼:
#!/bin/bash
md51=`md5sum -b ./source/test1.mp4|cut -b 1-32` &
md52=`md5sum -b ./source/test2.mp4|cut -b 1-32` &
wait
echo "md51=$md51">./test.txt
echo "md52=$md52">>./test.txt
“test.txt”的結果:
md51=
md52=
uj5u.com熱心網友回復:
更新的答案
如果您真的非常想避免中間檔案,您可以按照@Socowi 在評論中的建議使用GNU Parallel 。所以,如果你運行這個:
parallel -k md5sum {} ::: test1.mp4 test2.mp4
你會得到這樣的東西,-k無論哪個先完成,輸出都會保持順序:
d5494cafb551b56424d83889086bd128 test1.mp4
3955a4ddb985de2c99f3d7f7bc5235f8 test2.mp4
現在,如果您將換行符轉換為空格,如下所示:
parallel -k md5sum {} ::: test1.mp4 test2.mp4 | tr '\n' ' '
你會得到:
d5494cafb551b56424d83889086bd128 test1.mp4 3955a4ddb985de2c99f3d7f7bc5235f8 test2.mp4
然后,您可以將read其轉換為bash變數,_用于您不感興趣的散布部分:
read mp51 _ mp52 _ < <(parallel -k md5sum {} ::: test1.mp4 test2.mp4 | tr '\n' ' ')
echo $mp51, $mp52
d5494cafb551b56424d83889086bd128,3955a4ddb985de2c99f3d7f7bc5235f8
是的,如果您的檔案名中有空格或換行符,這將失敗,但如果需要,您可以連續執行越來越復雜的命令來處理您的問題未提及的情況,但是您有點錯過了重點我的建議。
原始答案
bash并沒有真正等待承諾結果的概念。所以你可以使用類似的東西:
md5sum test1.mp4 > md51.txt &
md5sum test2.mp4 > md52.txt &
wait # for both
md51=$(awk ‘{print $1}’ md51.txt)
md52=$(awk ‘{print $1}’ md52.txt)
rm md5?.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/532699.html
標籤:重击多线程命令替换
