如何在Linux上使用yes命令

yes命令似乎太简单,没有任何实际用途,但在本教程中,我们将向您展示它的应用程序,以及如何从它在Linux和MacOS中被压抑的积极作用中获益。

yes命令

yes命令是Linux和其他类似Unix的操作系统(如MacOS)中最简单的命令之一。所谓简单,我们指的是它的使用和最初实现的简单。最初版本的源代码-在System 7 Unix中发布,由Ken Thompson创作-只有6行代码。

但是不要因为它是一个简单的小命令就把它否定了。它可以以一些有趣和有用的方式使用。

YES是做什么的?

在没有任何命令行参数的情况下使用时,yes命令的行为就像您在一次又一次地键入“y”并按Enter键一样。非常快。它会一直这样做,直到您按下Ctrl+C来中断它。

yes

事实上,YES可用于重复生成您选择的任何消息。只需键入yes、空格、要使用的字符串,然后按Enter键即可。这通常用于使yes生成“yes”或“no”字符串的输出流。

yes yesyes anything you like

但那有什么用呢?

YES的输出可以通过管道传输到其他程序或脚本。

这听起来耳熟吗?您启动了一个长时间运行的进程,然后离开,让它继续运行。当您返回到计算机时,该过程根本没有完成。在你不在的时候,它会问你一个问题,然后坐在那里等待一个“是”或“否”的回答。

如果您事先知道您的所有答案都将是肯定的(“是”或“y”)或否定的(“否”或“n”),您可以使用yes为您提供这些回答。然后,您的漫长流程将在无人值守的情况下一直运行到完成,并提供流程提出的任何问题的答案。

对脚本使用yes

请看下面的Bash shell脚本。(我们需要想象这是一个大得多的脚本的一部分,需要相当长的时间才能运行。)

#!/bin/bash # ... # in the middle of some long script # obtain a response from the user # ... echo "Are you happy to proceed? [y,n]" read input # did we get an input value? if [ "$input" == "" ]; then echo "Nothing was entered by the user" # was it a y or a yes? elif [[ "$input" == "y" ]] || [[ "$input" == "yes" ]]; then echo "Positive response: $input" # treat anything else as a negative response else echo "negative response: $input" fi

此脚本询问问题并等待响应。脚本中的逻辑流由用户的输入决定。

“是”或“是”表示正面回应。 任何其他输入都被视为负面响应。 在没有输入文本的情况下按Enter键不执行任何操作。

要测试这一点,请将脚本复制到一个文件,并将其另存为long_script.sh。使用chmod使其可执行。

chmod +x long_script.sh

使用以下命令运行该脚本。尝试输入“yes”、“y”和任何其他内容,包括在不输入文本的情况下按Enter键。

./long_script.sh

要获得yes以提供我们对脚本问题的响应,请通过管道将输出从yes传输到脚本。

yes | ./long_script.sh

一些脚本在他们的要求上比较僵硬,只接受完整的“是”这个词作为积极的回应。您可以将“yes”作为参数提供给yes,如下所示:

yes yes | ./long_script.sh

不经过深思熟虑就不要答应

您需要确保您要输入到脚本或程序中的输入肯定会给您带来预期的结果。为了能够做出这个决定,你必须不知道问题和你的回答应该是什么。

脚本、命令或程序中的逻辑可能与您的预期不符。在我们的示例脚本中,问题可能是“您想要停止吗?[y,n].“。如果是这样的话,否定的响应将允许脚本继续执行。

您必须熟悉脚本、命令或程序,然后才能轻松地将yes输入其中。

对命令使用yes

在其萌芽阶段,yes将与其他Linux命令一起使用。从那时起,大多数其他Linux命令都有自己的运行方式,无需人工交互。要做到这一点,不再需要“是”。

让我们以Ubuntu包管理器apt-get为例。要在安装过程中不按“y”键即可安装应用程序,请按如下方式使用yes:

yes | sudo apt-get install fortune-mod

使用apt-get中的-y(假设是)选项可以获得相同的结果:

sudo apt-get -y install fortune-mod

您将看到apt-get甚至没有像往常一样询问“您想继续吗?”[是/否]“问题。它只是假设答案是“是的”。

在其他Linux发行版上,情况也是如此。在Fedora上,您可能会一次使用这种类型的软件包管理器命令:

yes | yum install fortune-mod

DNF包管理器已经取代了yum,并且DNF有自己的-y选项(假设是)。

dnf -y install fortune-mod

这同样适用于cp、fsck和rm。这些命令都有自己的-f(强制)或-y(假设是)选项。

那么,YES似乎已经沦落到只使用脚本的地步了吗?不完全是。这条老狗还有更多的把戏。

一些更多的是的把戏

您可以将yes与seq生成的数字序列一起使用,以控制重复操作的循环。

此一行程序将生成的数字回显到终端窗口,然后调用睡眠一秒钟。

您可以调用另一个命令或脚本,而不是简单地将数字回显到终端窗口。该命令或脚本甚至不需要使用数字,它们只用于启动循环的每个周期。

yes "$(seq 1 20)" | while read digit; do echo digit; sleep 1; done

有时,使用一个大文件进行测试很有用。您可能想要练习使用zip命令,或者您想要有一个相当大的文件来测试FTP上载。

使用yes可以快速生成大文件。您所需要做的就是给它一个长的文本字符串来处理,并将输出重定向到一个文件中。毫无疑问,这些文件会迅速增长。准备好在几秒钟内按下Ctrl+C。

yes long line of meaningless text for file padding > test.txtls -lh test.txtwc test.txt

在用于研究本文的测试机器上,这里生成的文件花了大约5秒的时间。Ols报告它的大小是557Mb,WC告诉我们它有1240万行。

我们可以通过在命令字符串中包含HEAD来限制文件的大小。我们告诉它要在文件中包含多少行。-50表示HEAD只允许50行进入test.txt文件。

yes long line of meaningless text for file padding | head -50 > test.txt

一旦test.txt文件中有50行,该过程就会停止。您不需要使用Ctrl+C,它会自动优雅地停止。

WC报告文件中正好有50行,400个字,大小为2350字节。

尽管它对于将响应反馈到长时间运行的脚本(以及其他一些技巧)仍然很有用,但是yes命令不会成为您日常命令工具箱的一部分。但是当你真的需要它的时候,你会发现它本身就很简单--而且全部都是六行金色代码。

相关文章