如何在这一行 Perl 脚本上扩展以运行命令直到输出特定的 KEYWORD,然后还播放声音?

问题描述 投票:0回答:2

我的 NordVPN 帐户有问题,有时我不得不使用他们糟糕的 CLI 工具运行客户端 10 次以上,直到它最终成功选择接受我登录的服务器。

我在这里看到了一篇旧帖子,我根据自己的需要进行了改编,目前看起来像这样:

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

它一直运行 connect 直到它在输出中观察到“connected”这个词。但我想进一步扩展这一步。当它成功获取输出中的关键字时,我希望它能够“mpv success.wav”或类似的东西,以播放位于同一目录中的简单 .wav 文件。 mpv 非常适合这个。

非常感谢!

perl vpn one-liner mpv
2个回答
1
投票

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

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

无论

mpv
做什么,这都会打印到屏幕上,例如可以通过更改为

来避免什么
system("mpv success.wav > /dev/null 2>&1")

此处

STDOUT
流被重定向null设备
/dev/null
)然后
STDERR
流(文件描述符2)被重定向到
STDOUT
(fd 1)。所以这一切都变成了空虚。

还有,可以反过来

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

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


0
投票

mpv success.wav
退出时运行
perl

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/'
© www.soinside.com 2019 - 2024. All rights reserved.