我正在尝试编写一个Perl脚本,它可以更好地使用KDE的kwrited
,据我所知,它连接到pts并通过它接收它接收的每一行KDE系统托盘通知,标题为“KDE write daemon”。
不幸的是,它会针对每一行发出单独的通知,因此它会在常规旧write上使用多行消息向系统托盘发送垃圾邮件,并且由于某种原因,它会切断邮件的整个最后一行。使用wall。单行消息也不复存在。
我也希望能够通过局域网与胖客户端进行广播。在开始之前(当然需要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
答案 0 :(得分:4)
您只提供一个命令行参数(字符串“Testing 1 2 3
”)。
所以$ ARGV [1]是undef。
因为$device
内的逻辑,所以if ($ARGV[0] ne "")
是undef。
所以你的shell的echo
命令重定向到空(“echo something >
”),因此shell抱怨(这也是“未定义$ device”Perl警告的地方)。
如果您将设备设为“1”,则在命令行上取消引用参数字符串(perl write.pl Testing 1 2 3
)。
另外,请考虑打开$ device作为文件,以便将“$ message”写入文件句柄。这是一个更加惯用的Perl,并且不太容易出现perl-to-shell转换/引用/等等问题......
答案 1 :(得分: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教程HERE