迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 操作系统 >

Bash 双管道

作者:迹忆客 最近更新:2023/05/19 浏览次数:

本文对管道和双管道进行了充分的探讨。 它将讨论管道在 Bash 命令脚本中的用法、符号和影响。

在现实生活中,管道将流体或气体从一个地方输送到另一个地方。 但在 Bash 中,管道不承载流体,而是将一个命令的输出作为下一个命令的输入传递。


Bash 中的管道

管道是一种重定向运算符,它将命令的输出传输到紧跟其后的命令的输入。 | 符号在 Bash 中用作管道。

我们也可以说,在 Linux/UNIX 系统中,管道将一个命令的标准输出连接到另一个命令的标准输入。

管道还用于组合两个或多个命令,其中前一个命令的输出成为后一个命令的输入。 这个东西消除了文件使用的开销。

通常,当我们要从文件中提取一些相关信息时,我们首先将之前的输出保存到文件中,然后从文件中读取,将文件流转换为需要的输出。

但是,在管道中,一个命令的输出直接作为输入提供给另一个命令。 下面显示了命令的基本符号。

Comand-1 | command-2 | .... | command-N

在 ls 和 grep 之间添加管道

现在我们将看到管道将一个命令的输出连接到下一个命令的输入的示例。 在此示例中,我们将从给定目录中的一堆文件中按名称选择所需的文件。

只需打开终端并转到您放置文件的目录,然后在其上写入 ls 命令。 ls -l 命令将列出所选目录文件的详细信息。

然而,我们的目标是选择 ls -l 的输出,添加一个管道,并搜索特定的文件名,以便输出可能只包含所需的文件。

按照代码,首先列出给定目录中所有文件的名称。

ls -l

ls 命令的输出

当前目录下有三个文件; 他们的详细信息显示在屏幕截图中。 但是,我们对 bash_double_pipe.md 文件的详细信息感兴趣。

我们将使用管道和 grep 该文件及其名称。

以下代码将显示 bash_double_pipe.md 的详细信息。

ls -l | grep "bash_double_pipe.md"

ls 与管道命令

避免使用管道进行 I\O 重定向

管道在重定向期间不使用标准输入或输出。 管道在主存中实现。

以下示例将显示使用和不使用管道的流重定向。

没有管道的 I\O 重定向

ls -l > temp

more < temp

上面给出的代码将 ls -l 的输出重定向到临时文件,然后在屏幕上显示临时文件的内容。 以下屏幕截图显示了上述运行代码的输出。

io重定向

现在,我们将探索不使用管道的标准输入或输出的 IO 重定向。 上面的示例将第一个命令的输出重定向到第二个命令的输入。

以下代码提供相同的 IO 重定向操作,但使用管道。

ls -l | more

上面的代码将在没有磁盘 IO 的情况下执行相同的重定向操作。 以下屏幕截图显示了上述运行命令的结果。

使用 bash 进行 io 重定向

上面的截图显示我们可以在没有磁盘 IO 的情况下使用管道进行重定向。

在 cat、grep、tee 和 wc 命令上使用管道

管道在 catgrepteewc 命令中也非常有用。 假设我们想查看一条记录在文件中出现了多少次。

然后,我们不需要创建许多变量,而是需要在这些命令之间使用管道并获得所需的输出。

以下代码显示了 cat、grep、tee 和 wc 命令以及管道的用法。

cat abc.txt | grep "temp" | tee file2.txt | wc -l

cat 命令将 abc.txt 的所有内容传递给 grep 命令。 grep 命令仅选择具有与 temp 匹配的字符串的行。

然后将包含临时字符串的行传递给 tee 命令,该命令将输出写入 file2.txt。

之后,这个输出被传递给 wc 命令,它计算其中的记录数。 file2.txt 有三行; 上述命令的输出是 3。

cat grep pipe

总结这篇文章,管道对于将一个命令的输出传输到下一个命令的输入非常有用。


单管道和双管道的区别

单管 | 将一个命令的输出发送到下一个命令的输入,但双管道 || 与单管道不同。 双竖线表示 OR 运算符,一般用在条件语句中。

OR 运算符的语法和短路评估

下面的代码显示了双管道的基本符号。

command-1 || command-2

上面的代码显示了 || 的基本符号和用法 操作员。 Bash 支持短路评估。

短路评估意味着条件的评估在变得明确后立即停止并返回最终决定。 例如,具有多个表达式与 OR 运算符组合的复合条件将在其中一个表达式结果为真时立即停止。

它不会进一步评估其他表达式,因为它们的结果不会再影响最终决定。

因此,Bash 解释器会尝试执行上面 Bash 脚本中的第一条命令。 如果第一个命令执行成功,则 command-2 将不会执行。

仅当第一个命令未成功执行时,第二个命令才会执行。

让我们探讨一下双管道的例子。

ls -a || echo "hello world"

在上面的脚本中,在 command-1 中,我们列出了当前目录的元素。 在 command-2 中,我们打印消息 hello world。

我们在这两个命令之间使用了双管道。 当我们运行上面的命令时,command-1 成功列出了当前目录的元素,因此,command-2 被忽略了。

现在让我们探讨一下 command-1 没有成功执行的场景。

ls a || echo "hello world"

上面的命令显示了执行第二个命令的场景。 在第一个命令中,我们没有在 a 标志前使用连字符 (-); 因此,该命令将不会成功运行。

因此,OR 运算符将执行 echo 命令,打印 hello world 消息。

以下屏幕截图显示了上述两个命令的输出。

双管道

上面的想法可以扩展到链接任意数量的命令。 例如,以下脚本将使用 || 链接四个命令 运算符,评估将从左到右开始。

一旦任何命令成功执行,右侧的所有剩余命令都将被跳过。

Command-1 || Command-2 || Command-3 || command-4

总结

本文讨论了单管和双管标志及其功能。 单管道符号代表 Linux 管道,它将一个命令的输出放入另一个命令的输入。

另一方面,双竖线符号是逻辑或运算符,有助于逻辑运算。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便