如何在 Linux 上使用 yes 命令

yes 命令似乎太简单了,没有任何实际用途,但在本教程中,我们将向您展示它的应用以及如何从它在 Linux 和 macOS 中被压抑的积极性中获益。
yes 命令
yes
命令是 Linux 和其他类 Unix 操作系统(如 macOS)中最简单的命令之一。简单是指其使用和初始实施简单。原始版本的源代码(在 System 7 Unix 中发布并由 Ken Thompson 编写)只有六行代码。
但是不要因为它是一个简单的小命令而将其注销。它可以以一些有趣和有用的方式使用。
是做什么的?
在没有任何命令行参数的情况下使用,yes
命令的行为就像您一遍又一遍(一遍又一遍)键入“y”并按下 Enter。很快。它将继续这样做,直到您按 Ctrl+C 中断它。
yes

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

yes anything you like

但是那有什么用呢?
yes
的输出可以通过管道传输到其他程序或脚本中。
这听起来很熟悉吗?您开始运行一个漫长的过程,然后离开,让它继续运行。当您返回计算机时,该过程根本没有完成。在你不在的时候,它会问你一个问题,然后坐下来等待“是”或“否”的回答。
如果您事先知道您的所有答案都是肯定的(“yes”或“y”)或否定的(“no”或“n”),您可以使用 yes
为你。然后,您的漫长过程将在无人看管的情况下运行到完成,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
此脚本提出一个问题并等待响应。脚本中的逻辑流由用户的输入决定。
- “是”或“y”表示肯定的回答。
- 任何其他输入都被视为否定响应。
- 在没有输入文本的情况下按 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 命令都有自己的运行方式,无需人工干预。 yes
不再需要实现这一点。
让我们以 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
生成的数字序列一起使用,以控制重复操作的循环。
这个单行将生成的数字回显到终端窗口,然后调用 sleep
一秒钟。
您可以调用另一个命令或脚本,而不是简单地将数字回显到终端窗口。该命令或脚本甚至不需要使用数字,它们只是用来启动循环的每个循环。
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.txt
ls -lh test.txt
wc test.txt

此处生成的文件在用于研究本文的测试机上花费了大约五秒钟。 ls
报告它的大小为 557 Mb,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
命令不会成为您日常命令工具包的一部分。但是当你确实需要它时,你会发现它本身就是简单的——而且全部都在六行黄金代码中。
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts