Linux shell bug?管道中的变量赋值不起作用

Exp*_*ob1 3 linux shell

为什么FILE_FOUND在这个bugger的末尾为0:

FILE_FOUND=0

touch /tmp/$$.txt

ls -1 /tmp/$$.* 2>/dev/null | while read item; do
    FILE_FOUND=1
    echo "FILE_FOUND = $FILE_FOUND"
done

echo "FILE_FOUND = $FILE_FOUND"

rm -f /tmp/$$.txt 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

?? !!

在Unix上,FILE_FOUND保持为1(应该如此),但在Linux(RedHat,Cygwin,..)上,它会跳回到0!

它是Linux shell功能,而不是bug吗?:)

请帮忙.

pix*_*eat 5

因为你输入while而导致的常见问题,因此在子shell中运行,而子shell无法将环境变量传递回其父级.我猜这个"unix"在这方面有所不同,因为你在那里运行一个不同的shell(ksh?)

可能不需要到while循环的管道.你能用这个成语吗?

for item in /tmp/$$.*; do
    ....
done
Run Code Online (Sandbox Code Playgroud)

如果你必须使用子shell,那么你将不得不做一些外部的过程,如:

touch /tmp/file_found
Run Code Online (Sandbox Code Playgroud)

  • http://mywiki.wooledge.org/BashFAQ/024 - "出现这种令人惊讶的行为的原因是,当它是管道的一部分时,while/for/until循环在SubShell中运行." 和"当使用重定向或带有循环的管道时,不同的shell表现不同" (2认同)
  • 没有http://stackoverflow.com/questions/496702/can-a-shell-script-set-environment-variables-of-the-calling-shell (2认同)