我有一个简单的echo
打印输出,已添加到我的.bashrc
:
echo "$(tput setaf 2)Wake up....."
sleep 2s
reset
sleep 2s
echo "$(tput setaf 2)Wake up....."
sleep 2s
reset
echo "$(tput setaf 2)Wake up neo....."
sleep 2s
echo "$(tput setaf 2)The Matrix has you......"
sleep 2s
reset
echo "$(tput setaf 2)Follow the white rabbit......"
sleep 2s
reset
cmatrix
这会向终端打印一条消息,但我希望它看起来好像正在输入,字符之间有一致的延迟。
这不适用于 Wayland;如果您使用的是 Ubuntu 17.10 并且没有更改为在登录时使用 Xorg,则此解决方案不适合您。
你可以使用
xdotool
它。如果击键之间的延迟应该是一致的,就这么简单:这种类型在每次击键之间有毫秒
something
的延迟。100
如果击键之间的延迟应该是随机的,比如说从 100 到 300 毫秒,事情会变得有点复杂:
这个
for
循环遍历保存在 variable 中的字符串的每个字母text
,打印key <letter>
或者key space
在空格后跟sleep 0.
一个 1 到 3 之间的随机数的情况下打印(xdotool
'ssleep
将数字解释为秒)。然后将循环的整个输出通过管道传输到xdotool
,它打印具有随机延迟的字母。如果您想更改延迟,只需更改部分,即下限和上限 - 0.2 到 0.5 秒。(RANDOM%x)+y
y
x-1+y
(RANDOM%4)+2
请注意,这种方法不会打印文本,而是像用户一样输入文本,合成单个按键。结果,文本被输入到当前聚焦的窗口中;如果您更改文本的焦点部分,则会在新聚焦的窗口中输入,这可能是也可能不是您想要的。无论哪种情况,请查看此处的其他答案,所有这些都很棒!
我在阅读@dessert 的答案后尝试了 xdotool,但由于某种原因无法使其正常工作。所以我想出了这个:
将您的文本输入到上面的代码中,它将像打字一样打印。您还可以通过替换为来添加
sleep 0.1
随机性sleep 0.$((RANDOM%3))
。带有假错字的扩展版
这个版本会不时引入一个虚假的错字并更正它:
您提到了字符之间的一致延迟,但如果您真的希望它看起来像正在输入,那么时间将不会完全一致。为此,您可以使用命令记录自己的输入并使用以下
script
命令进行回放scriptreplay
:按 CTRL-D 停止录制。
-t
将参数传递给script
指示它还生成时间信息,我已将其重定向到script.timing
文件。我已将sed d
其作为命令传递给,script
因为这只是一种吸收输入(并记录击键)而没有副作用的方法。如果你也想做所有
tput
/的reset
事情,你可能想为你的script
每一行做一个录音,然后回放它们,与tput
/reset
命令交错。另一种可能是使用Demo Magic,或者更准确地说只是这个脚本集合的打印功能,基本上相当于
在后台,这使用了pv,当然你也可以直接使用它来获得想要的效果,基本形式如下所示:
根据我的昵称,我可以提供另一种解决方案:
看起来很奇怪,不是吗?
-MTime::HiRes=usleep
从模块导入函数usleep
(微秒睡眠),Time::HiRes
因为通常sleep
只接受整数秒。-F''
将给定的输入拆分为字符(分隔符为空''
)并将字符放入数组中@F
。BEGIN {$|=1}
禁用输出缓冲,以便立即打印每个字符。for (@F) { print; usleep(100_000+rand(200_000)) }
只是迭代字符1_000
(==1000
) 或者即使1_0_00
我们认为这样更容易阅读。rand()
返回一个介于 0 和给定参数之间的随机数,因此它一起休眠 100,000 到 299,999 微秒(0.1-0.3 秒)。我很惊讶还没有人提到这一点,但您可以使用库存工具和循环来完成此操作:
它只是逐个字符地循环输入,并在每个字符之后延迟打印出来。唯一棘手的一点是您必须将 IFS 设置为空字符串,因此 bash 不会尝试分割您的空间。
这个解决方案非常简单,所以在字符之间添加可变延迟,错别字,任何超级容易的东西。
编辑(谢谢,@dessert):如果你想要一个更自然的界面,你可以改为
这将允许您调用函数
typeit foo bar
而不是typeit 'foo bar'
. 请注意,如果没有引号,参数会受到 bash 的分词,例如typeit foo<space><space>bar
将 printfoo<space>bar
。要保留空格,请使用引号。另一个可能有效的工具是asciicinema,它不依赖于 x11 或其他任何东西。它会记录您在终端中所做的一切,并让您像截屏一样重播它,只有这样它才纯粹基于 ascii!但是,您可能必须暂时禁用您的提示,以使其在视觉上完全干净。正如其他人指出的那样,添加一致的延迟看起来并不自然,而自己输入可能是您可以获得的最自然的外观之一。
录制文本后,您可以执行以下操作:
首先,正如其他人所指出的那样,“看起来好像正在输入,字符之间有一致的延迟......”有点矛盾。输入的内容没有一致的延迟。当您看到某些产品的延迟不一致时,您会感到不寒而栗。“什么占用了我的电脑!!!???”
反正...
我必须大声疾呼
expect
,它应该在大多数 Linux 发行版上都可用。老派,我知道,但是——假设它已经安装——它再简单不过了:从手册页:
见https://www.tcl.tk/man/expect5.31/expect.1.html