如果后跟管道(bash bug?),Bash变量默认不起作用

sta*_*fry 4 linux bash

我刚刚发现了一个bash我不明白的奇怪行为.表达方式

${variable:=default}
Run Code Online (Sandbox Code Playgroud)

如果尚未设置,则设置variable为该值default.请考虑以下示例:

#!/bin/bash
file ${foo:=$1}
echo "foo >$foo<"
file ${bar:=$1} | cat
echo "bar >$bar<"
Run Code Online (Sandbox Code Playgroud)

输出是:

$ ./test myfile.txt
myfile.txt: ASCII text
foo >myfile.txt<
myfile.txt: ASCII text
bar ><
Run Code Online (Sandbox Code Playgroud)

您会注意到变量foo被赋值为$1但变量bar不是,即使它的默认结果被显示给file命令.

如果删除无害管进入cat从第4行并重新运行它,然后它都foobar获得设定的值$1

我在这里错过了什么,或者这可能是一个bash错误?

(GNU bash,版本4.3.30)

Cyr*_*rus 5

在第二种情况下file是管道构件并且在其自己的壳中作为每个管道构件运行.当file其子shell结束时,$b其新值$1不再存在.

解决方法:

#!/bin/bash
file ${foo:=$1}
echo "foo >$foo<"

: "${bar:=$1}"     # Parameter Expansion before subshell

file $bar | cat
echo "bar >$bar<"
Run Code Online (Sandbox Code Playgroud)