为什么 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")
我正在尝试了解 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")