我正在 Ubuntu 中试验命名管道,但之前没有使用它们的经验。我做了以下事情:
mkfifo pipe
ls>pipe&
cat pipe
这会将我文件夹中所有文件的列表输入pipe
并显示它们。我试图一次读取管道 2 行。所以,我想要一个命令,当执行一次时,会给出文件夹中第一个和第二个文件的名称。如果再次执行该命令,我想要第三个和第四个文件名。有什么办法吗?
我试过了head -2 pipe
。它显示了前两个文件名。但是当它再次被执行时,它被吊死了。正确的方向是什么?
我正在 Ubuntu 中试验命名管道,但之前没有使用它们的经验。我做了以下事情:
mkfifo pipe
ls>pipe&
cat pipe
这会将我文件夹中所有文件的列表输入pipe
并显示它们。我试图一次读取管道 2 行。所以,我想要一个命令,当执行一次时,会给出文件夹中第一个和第二个文件的名称。如果再次执行该命令,我想要第三个和第四个文件名。有什么办法吗?
我试过了head -2 pipe
。它显示了前两个文件名。但是当它再次被执行时,它被吊死了。正确的方向是什么?
您希望在阅读端保持先进先出。一种方法是让 bash 为其保留一个打开的文件描述符。
您需要一个读取两行且不超过两行的命令。
当输入是不可搜索的管道时,为了能够做到这一点,命令有三个选择:
1 在许多系统上很昂贵,因为这是
read()
每字节一个系统调用。2 和 3 不适用于所有系统,因为并非所有系统都支持窥视管道或将数据放回管道,而且当多个进程同时从管道读取时,这也不可靠。所以一般来说,除了少数例外,当输入不可搜索时,命令通常不会费心阅读它们被告知的确切行数。
在大多数实现中
head
,head -n2
将输出其输入的前两行,但可能会消耗更多输入。一个值得注意的例外是head
ksh93 shell 的内置函数,如果可以,它会偷看,否则一次读取一个字节。有些命令可以被告知以确保他们不会读到他们被告知要处理的最后一行。
使用 GNU
sed
,可以-u
选择:将读取 2 行(一次 1 个字节),仅此而已。
该
line
实用程序(不再是标准实用程序,因此如今并不总是如此)是一种仅读取一行的实用程序。read
内建的要求sh
不超过一行。因此,line
上面的命令可以通过以下方式实现:(需要注意的是,即使输入行没有终止,它也会添加换行符)。
(POSIX 实际上证明删除是合理
line
的,因为它可以通过 来实现read
)。对于
line
不添加额外换行符并在 eof 上返回 false 的实现。而且
twolines
只是:然后你可以这样做: