如何扩展这一行Perl脚本来运行命令,直到输出中出现特定的关键字,然后还播放声音?

enxuqcxy  于 2023-05-01  发布在  Perl
关注(0)|答案(2)|浏览(131)

我有一个问题,我的NordVPN帐户,我有时不得不运行客户端10倍以上,与他们的可怕的CLI工具,直到它最终成功地选择了一个服务器,接受我的登录。
我在这里遇到了一个旧帖子,我根据自己的需要进行了调整,现在看起来是这样的:

perl -e 'do { sleep(7); $_ = `nordvpn connect`; print $_; } until (m/connected/);'

它一直运行connect,直到它在输出中看到“connected”这个词。但我想进一步扩展这一点。当它成功地在输出中获取关键字时,我希望它然后为“mpv成功”。wav'或一些类似的东西,玩一个简单的。wav文件位于同一目录。mpv在这方面效果很好。
非常感谢提前!

k3bvogb1

k3bvogb11#

该循环在满足条件时退出,因此只需在循环完成后添加所需的操作

perl -we'do { sleep(7); $_ = `nordvpn connect`; print $_; } 
    until (/connected/); system("mpv success.wav")'

无论mpv执行什么操作,都将打印到屏幕上,例如,可以通过更改为

system("mpv success.wav > /dev/null 2>&1")

这里STDOUT流是redirectednull device/dev/null),然后STDERR流(文件描述符2)被重定向到STDOUT(fd 1)。所以一切都归于虚无。
而且,一个人可以把它转过来

perl -we'while (sleep 7) { 
    if (`nordvpn connect` =~ /connected/) { system("mpv success.wav"); last } }'

虽然这不是那么简洁,但它对于进一步的更改来说更加灵活。它不像原来那样打印命令的返回。如果真的需要的话,这很容易添加。

jum4pzuy

jum4pzuy2#

perl退出时运行mpv success.wav即可。

perl -e'do { sleep 7; $_ = `nordvpn connect`; print; } until /connected/;'
mpv success.wav

如果你想在一行中显示所有内容,可以使用分号。

perl -e'...'; mpv success.wav

类似,但避免播放声音,如果perl被杀死(例如。例如使用Ctrl-C)。

perl -e'...' && mpv success.wav

如果nordvpn在连接时将退出代码设置为0,否则设置为非零,则Perl程序可以简化为以下内容:

perl -e'sleep 7 while system "nordvpn connect"'

如果它没有如上所述设置退出代码,并且如果您不想看到nordvpn的输出,Perl程序可以简化为以下内容:

perl -e'sleep 7 while `nordvpn connect` !~ /connected/'

相关问题