On Wed, Apr 13, 2016 at 10:01:23AM +0800, 何建军 wrote: > Hi, I use a very simple statement "cat test.txt | while read line; do echo > $line; done", test.txt is very small, no more than 100 lines. but the > execution of the statement paused during process. test.txt is pasted on > http://paste.bradleygill.com/index.php?paste_id=1647399 > desmond.he@xgimi-dev:/studio/desmond.he$ help | head -n 1 GNU bash, version > 4.3.11(1)-release (x86_64-pc-linux-gnu) > desmond.he@xgimi-dev:/studio/desmond.he$ cat /etc/lsb-release > DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 DISTRIB_CODENAME=trusty > DISTRIB_DESCRIPTION="Ubuntu 14.04.3 LTS" Thanks for help~
You didn't quote the expansion of the line variable, so the result of the expansion is first split into words based on the characters in the special IFS variable, then each of those words that contain glob characters (like *, ? , [...]) will be replaced by matching filenames, if any. It's the last part that bites you here, since several of your lines contain * characters. Worse if globstar is enabled, since there's also ** in there, so the "pause" you get is probably bash trying to recurse through the entire filesystem, which may take a while. The fix is easy. Just surround the expansion in double quotes, which prevent word-splitting and pathname expansion. while read -r line; do echo "$line"; done < test.txt though printf should be preferred over echo: while read -r line; do printf '%s\n' "$line"; done < test.txt -- Geir Hauge