为什么 bash 中的 read 命令使用 herestring 而不是管道输出?

Why does the read command in bash work with a herestring but not with piped output?

我正在尝试了解 bash read 命令的幕后工作原理。 鉴于它期望其输入来自标准输入,我惊讶地发现管道输入无法按预期工作。例如

### Pipe scenario

echo "1 2 3" | read -r one two three
echo "one: $one, two: $two, three: $three"
# output:   'one: , two: , three:' 

### Herestring scenario

read -r one two three <<< "1 2 3"
echo "one: $one, two: $two, three: $three"
# output:   'one: 1, two: 2, three: 3'

谁能解释一下(从读取命令的角度来看)上述两种提供输入的基本方式有何不同?



编辑以回应评论:

我不想知道"how to work around passing input via a pipe",喜欢评论中的链接问题。我知道该怎么做(例如,我可以使用 herestring!)。

我的问题是,使读取在这两种情况下表现不同的底层机制是什么?

read 有效,但您需要在同一个子 shell 中请求值:

echo "1 2 3" | (read -r one two three && echo "one: $one, two: $two, three: $three")

另一种选择是

read -r one two three < <( echo "1 2 3")