我寫一個shell腳本來模擬多線程是這樣的:多線程殼for循環與找到包含文件名的空格
#!/bin/sh
PROCESS_NUM=5
FIFO=/tmp/$$.fifo
mkfifo $FIFO
exec 3<>$FIFO
for i in $(seq 1 $PROCESS_NUM); do
echo $i>&3
done
echo "= start ="
for i in $(find "$1" -iname "*.jpg")
do
read -u3 p
{
md5sum "$i"
echo $p>&3
} &
done
wait
exec 3>&-
rm $FIFO
echo "= end ="
這是確定和這樣的輸出:
= start =
2f6add89a29b1315166255c41899744b ./img.jpg
...
...
...
= end =
但當文件這是錯誤和輸出是這樣的:
= start =
md5sum: ./my: No such file or directory
md5sum: img.jpg: No such file or directory
...
...
...
= end =
所以我改變這樣的循環:
find "$1" -iname "*.jpg"|while read i
do
read -u3 p
{
md5sum "$i"
echo $p>&3
} &
done
這是確定的,但它不會等待後臺進程完成日常:
= start =
...
...
= end =
2f6add89a29b1315166255c41899744b ./my img.jpg
...
我應該如何解決這個問題?
BashPitfalls#1:http://mywiki.wooledge.org/BashPitfalls – 2014-10-10 17:44:44
... waitaminute。你已經用空格解決了這個問題,那麼你爲什麼仍然是你題目的一部分,還有一半是你的問題?感覺就像我浪費了很多時間閱讀你已經修好的東西。 – 2014-10-10 17:45:36
請注意MVCE的「最小」部分:http://stackoverflow.com/help/mcve – 2014-10-10 17:46:07