与进程替换一起使用时,粘贴命令输出制表符而不是换行符

与进程替换一起使用时,粘贴命令输出制表符而不是换行符

下面的第一个命令在单独的行上生成每个数字,我希望第二个命令执行相同的操作,因为两者之间的唯一区别是我们使用的是echo '1 2 3'and echo {1..3}(两者都产生相同的输出)。但是,第二个命令生成用制表符分隔的数字,而不是换行符。为什么?

此外,请注意,第二个和第三个命令之间的唯一区别是我们通过进程替换将结果传递给paste,但如果没有它,它会显示预期的结果,这可能意味着这是一个paste相关的问题,但我不这样做不太明白问题是什么。

§ paste <(echo '1 2 3' | tr ' ' '\t' | tr '\t' '\n')
1
2
3

§ paste <(echo {1..3} | tr ' ' '\t' | tr '\t' '\n')
1   2   3


§ echo {1..3} | tr ' ' '\t' | tr '\t' '\n'
1
2
3

我尝试查看进程替换管道末尾产生的输出,以查看输出的内容,它确实看起来是相同的。

§ paste <(echo {1..3} | tr ' ' '\t' | tr '\t' '\n' | tee /dev/stderr) > /dev/null 
1
2
3

§ paste <(echo '1 2 3' | tr ' ' '\t' | tr '\t' '\n' | tee /dev/stderr) > /dev/null 
1
2
3

如果重要的话,这里是工具的版本:

§ which tr paste
/usr/local/opt/coreutils/libexec/gnubin/tr
/usr/local/opt/coreutils/libexec/gnubin/paste
§ tr --version
tr (GNU coreutils) 9.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.

Written by Jim Meyering.
§ paste --version
paste (GNU coreutils) 9.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.

Written by David M. Ihnat and David MacKenzie.
§ bash --version
bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin20)
Copyright (C) 2007 Free Software Foundation, Inc.
§ sw_vers
ProductName:    macOS
ProductVersion: 11.7.10
BuildVersion:   20G1427

我使用的是 macOS,但使用通过brew.


添加活跃评论所请求的调试信息set -x

§ paste <(echo {1..3} | tr ' ' '\t' | tr '\t' '\n')
+ paste /dev/fd/63 /dev/fd/62 /dev/fd/61
++ echo 1
++ echo 3
++ tr ' ' '\t'
++ tr ' ' '\t'
++ tr '\t' '\n'
++ tr '\t' '\n'
++ echo 2
++ tr ' ' '\t'
++ tr '\t' '\n'
1   2   3
§ paste <(echo {1..3} | tr ' ' '\n')
+ paste /dev/fd/63 /dev/fd/62 /dev/fd/61
++ echo 1
++ tr ' ' '\n'
++ echo 2
++ echo 3
++ tr ' ' '\n'
++ tr ' ' '\n'
1   2   3
§ echo {1..3} | tr ' ' '\n' | paste
+ tr ' ' '\n'
+ echo 1 2 3
+ paste
1
2
3

hexdump输出:

§ paste <(echo {1..3} | tr ' ' '\n') | hexdump -C
00000000  31 09 32 09 33 0a                                 |1.2.3.|
00000006
§ echo {1..3} | tr ' ' '\n' | paste | hexdump -C
00000000  31 0a 32 0a 33 0a                                 |1.2.3.|
00000006

相关内容