0

我正在尝试编写一个可以更好地与 KDE 配合使用的 Perl 脚本,kwrited据我所知,该脚本连接到一个pts,并将它通过 KDE 系统托盘通知接收到的每一行都放入标题为“KDE write daemon”的行.

不幸的是,它对每一行都做了单独的通知,因此它会在常规旧write上用多行消息向系统托盘发送垃圾邮件,并且由于某种原因,它在使用wall时会切断整个消息的最后一行。单行消息也消失了。

我还希望它可以通过胖客户端在 LAN 上广播。在开始之前(当然,这需要 SSH),我尝试制作一个无 SSH 版本以确保它可以正常工作。不幸的是,它没有:

perl ./write.pl "Testing 1 2 3"

以下是 的内容./write.pl

#!/usr/bin/perl

use strict;
use warnings;

my $message = "";
my $device = "";
my $possibledevice = '`w -hs | grep "/usr/bin/kwrited"`'; #Where is kwrited?
$possibledevice =~ s/^[^\t][\t]//;
$possibledevice =~ s/[\t][^\t][\t ]\/usr\/bin\/kwrited$//;
$possibledevice = '/dev/'.$possibledevice;
unless ($possibledevice eq "") {
    $device = $possibledevice;
}

if ($ARGV[0] ne "") {
    $message = $ARGV[0];
    $device = $ARGV[1];
}
else {
    $device = $ARGV[0] unless $ARGV[0] eq "";
    while (<STDIN>) {
        chomp;
        $message .= <STDIN>;
    }
}

if ($message ne "") {
    system "echo \'$message\' > $device";
}
else {
    print "Error: empty message"
}

产生以下错误:

$ perl write.pl "Testing 1 2 3"
Use of uninitialized value $device in concatenation (.) or string at write.pl line 29.
sh: -c: line 0: syntax error near unexpected token `newline'
sh: -c: line 0: `echo 'foo' > '

不知何故,处理中的正则表达式和/或反引号转义$possibledevice无法正常工作,因为在 kwrited 连接到/dev/pts/0的地方,以下工作完美:

$ perl write.pl "Testing 1 2 3" /dev/pts/0
4

2 回答 2

4

您只提供一个命令行参数(字符串“ Testing 1 2 3”)。

所以 $ARGV[1] 是 undef。

$device由于里面的逻辑,undef 也是如此if ($ARGV[0] ne "")

因此,您的 shell 的echo命令将重定向到任何内容(“ echo something >”),因此 shell 会抱怨(这也是“未定义的 $device”Perl 警告的来源)。

如果您的意思是设备为“1”,则perl write.pl Testing 1 2 3在命令行中取消引用您的参数字符串 ()。

此外,请考虑将 $device 作为文件打开,以便将“$message”写入和打印到文件句柄。它有点惯用 Perl,不太容易出现由 perl 到 shell 转换/引用/等引起的问题...

于 2010-06-06T19:11:32.917 回答
0

一个问题是您'尝试的系统调用。Perl 中的单引号内不进行插值。

如果你看一个简单的案例:

#!/usr/bin/perl

use strict;
use warnings;


my $possibledevice = '`w -hs | grep "/usr/bin/kwrited"`'; #Where is kwrited?
print $possibledevice;

输出是:

`w -hs | grep "/usr/bin/kwrited"`

所以你的 shell 调用永远不会发生。解决方法是将 shell 调用更改为更像这样的内容:

my $possibledevice = `w -hs | grep \"/usr/bin/kwrited\"`; #shud b there...
#or
my $possibledevice = qx$w -hs | grep \"/usr/bin/kwrited\"$; #alternate form

您可以在 perlop 或 perldoc HERE中阅读不同的引用,如运算符

这里有一个反引号、系统和shell教程

于 2010-06-06T18:54:50.620 回答