给定以下 3 个脚本:
printf 'a\nb\nc\n' > file && { head -n 1; cat; } < file
printf 'a\nb\nc\n' | { head -n 1; cat; }
{ head -n 1; cat; } < <(printf 'a\nb\nc\n')
我期望每个的输出是:
a
b
c
但对于其中一些系统,在某些系统上,情况并非如此。例如,在 cygwin 上:
$ printf 'a\nb\nc\n' > file && { head -n 1; cat; } < file
a
b
c
$ printf 'a\nb\nc\n' | { head -n 1; cat; }
a
$ { head -n 1; cat; } < <(printf 'a\nb\nc\n')
a
是什么导致这些脚本的输出不同?
附加信息 - 这显然不仅仅是一个head
问题:
$ printf 'a\nb\nc\n' | { sed '1q'; cat; }
a
$ printf 'a\nb\nc\n' | { awk '1;{exit}'; cat; }
a
$ { sed '1q'; cat; } < <(printf 'a\nb\nc\n')
a
$ { awk '1;{exit}'; cat; } < <(printf 'a\nb\nc\n')
a
shell 中的一种健壮的 POSIX 方式(即不只是调用 awk 或类似的一次来完成所有操作)从输入中读取一些行并将其余行留给不同的命令,无论输入是否来自管道或一份文件?