我想在perl中执行几个unix命令。最好的方法是什么? 使用qx或system()更好吗?有没有一种好方法可以检查它是否失败?有人能给我一个很好的例子吗?感谢。
my $crflag=qx('/bin/touch /tmp/flag.done');
my $chgperm=qx('chmod 755 /tmp/flag.done');
VS
my $crflag = '/bin/touch /tmp/flag.done';
my $chgperm ='chmod 755 /tmp/flag.done';
system ($crflag);
system ($chgperm);
答案 0 :(得分:5)
您的代码存在一些问题:
system
,但这些步骤非常简单,可能应该直接在Perl中完成,而不是调用shell。 touch
在Perl中实际上是1次调用(如果你计算关闭文件,则为2次。)0644
而不是0755
。在Perl中,您可以使用以下内容解决上述所有问题:
#!/usr/bin/perl
use Fcntl qw( :DEFAULT ); # Core module, for O_CREAT, etc. constants
use strict;
use warnings;
# You probably want 0644, as a flag file probably shouldn't be executable..?
sysopen( my $fh, '/tmp/flag.done', O_CREAT|O_EXCL|O_RDWR, 0644 )
# Sysopen returns a undef if unsuccessful, with an error message stored in $!
or die "$!";
# write to it here, if you need to.
close( $fh );
你可以将它放入一个sub中,你想要创建一个(更多)原子创建步骤,以避免其他进程在大量shell调用之间干扰两次以创建文件,然后重置其权限。 (仍然存在对同步的担忧,因此它仍然可以被抢占,但这总体上是一个更好的解决方案。)
您可能希望使用其他标志。检查perldoc perlopentut
并搜索sysopen
以获取一个小列表,或查看perldoc Fcntl
和您平台的文档以获取更全面的列表。您可能还希望将0644
权限更改为更严格的限制,并且您可能还希望使用锁定;有关建议锁定的信息和代码示例,请参阅perldoc -f flock
。
答案 1 :(得分:4)
除了使用内置utime
和chmod
可以轻松完成这两项操作之外,IPC::System::Simple还提供错误检查。
use IPC::System::Simple qw( system );
system('/bin/touch /tmp/flag.done');
system('chmod 755 /tmp/flag.done');
答案 2 :(得分:2)
使用system
和$?
。当不需要输出时,尽量避免使用qx
。
system '/bin/touch /tmp/flag.done';
my $touch_status = $? >> 8;
system 'chmod 755 /tmp/flag.done';
my $chmod_status = $? >> 8;