ifne
- 如果标准输入不为空则运行命令
如果可能的话,如果标准输入也为空,我想运行命令;的其他部分ifne
。
$ printf "hello" | ifne echo "world"
world
如果标准输入为空,我想以不同的语句结束。
$ printf "" | ifne echo "world" || echo "else"
但它什么都不打印。有可能else
吗ifne
?
ifne
- 如果标准输入不为空则运行命令
如果可能的话,如果标准输入也为空,我想运行命令;的其他部分ifne
。
$ printf "hello" | ifne echo "world"
world
如果标准输入为空,我想以不同的语句结束。
$ printf "" | ifne echo "world" || echo "else"
但它什么都不打印。有可能else
吗ifne
?
如果标准输入不为空,则
ifne -n
不会运行sh …
,它的作用类似于cat
将输入传递给第二个ifne
。第二个ifne
将运行echo world
。这很简单。如果标准输入为空则
ifne -n
运行sh …
。我们不能只使用ifne -n echo else | …
,因为那样else
会得到第二个ifne
,我们也会得到world
。因此,我们3>&1
以前甚至可以使用整个片段的标准输出|
。它作为文件描述符 3 可用。ifne -n echo else >&3 | …
将打破非空输入的情况,其中数据必须从ifne -n
到ifne
。为了得到我们想要的,我们需要重定向echo
而不是ifne -n
自身;因此是内壳。您可以替换
echo else
为其他命令。您可以替换为另一个命令(如果您需要多个命令echo word
,则可能是这样)。sh -c …
我的观点是这个答案不依赖于else
或world
正在打印;替代品可能会或可能不会沉默,这并不重要。从手册页:
这使您可以执行以下操作:
如果您正在寻找一种 if-then-else 类型的解决方案,您可以将 stdout 通过管道传输到
tee
can call 的两个实例中ifne
:但是您也确实打印了原始标准输出。这就是通过的
ifne -n
过程。作为对现有答案的补充,请注意,它
ifne
通过尝试从 stdin 读取来工作,如果有什么东西来了,它会启动命令并通过管道循环将数据铲到它。然而,对于大多数类型的输入,应该可以检测是否有一些输入而无需读取它,这将节省提取处理并避免管道。
例如,您可以定义一个:
然后,你可以这样做:
poll()
在 LinuxPOLLIN
上,仅当有一些数据时才在管道上标记,但并非所有系统都是这种情况,因为有些系统还在文件末尾标记 POLLIN。因此 FIONREAD ioctl 检查是否确实有数据。ioctl 不适用于所有类型的输入。例如在 Linux 上,我发现它在/dev/null
. 至少它确实适用于常规文件、管道和 tty 设备。流水线
something
...如果somecommand
写入标准输出,则产生输出(字符串)。如果管道不产生任何输出,
somecommand
则不产生任何输出。这可能被捕获ifne -n
:测试:
请注意,这会丢弃管道中最左侧命令的输出。这可以通过使用类似的东西来补救
...作为管道的第二个命令,
cat
应该从左侧接收输出的任何命令在哪里。这也依赖于这样一个事实,即在第一个命令不产生任何输出的情况下,最后一个命令没有任何输入。