【发布时间】:2011-03-13 03:54:53
【问题描述】:
什么是我如何调用 shell 命令的示例,例如 Perl 脚本中的“ls -a”以及检索命令输出的方法?
【问题讨论】:
标签: perl
什么是我如何调用 shell 命令的示例,例如 Perl 脚本中的“ls -a”以及检索命令输出的方法?
【问题讨论】:
标签: perl
How to run a shell script from a Perl program
1.使用系统
system($command, @arguments);例如:
system("sh", "script.sh", "--help" ); system("sh script.sh --help");系统将执行 $command with @arguments 并在完成后返回您的脚本。你可以检查$! 对于外部应用程序传递给操作系统的某些错误。读 系统文档,了解如何变化的细微差别 调用略有不同。
2。使用
exec这和system的用法很相似,但是会 在执行时终止您的脚本。再次,阅读文档 exec 了解更多。
3.使用反引号或
qx//my $output = `script.sh --option`; my $output = qx/script.sh --option/;反引号运算符和它等效的
qx//,执行运算符内部的命令和选项,并在完成时将命令输出返回到STDOUT。还有一些方法可以通过创造性地使用open来运行外部应用程序,但这是高级用法;阅读文档了解更多信息。
【讨论】:
来自Perl HowTo,从 Perl 执行外部命令的最常见方法是:
my $files = `ls -la` — 捕获$files 中的命令输出
system "touch ~/foo" — 如果您不想捕获命令的输出exec "vim ~/foo" — 如果您不想在执行命令后返回脚本open(my $file, '|-', "grep foo"); print $file "foo\nbar" — 如果你想通过管道输入命令【讨论】:
`ls -l`;system("ls -l");exec("ls -l");【讨论】:
随着您使用 Perl 的经验越来越丰富,您会发现需要运行 shell 命令的场合越来越少。例如,获取文件列表的一种方法是使用 Perl 的内置 glob 函数。如果您希望列表按排序顺序排列,您可以将其与内置的 sort 函数结合使用。如果您想了解每个文件的详细信息,可以使用stat 函数。这是一个例子:
#!/usr/bin/perl
use strict;
use warnings;
foreach my $file ( sort glob('/home/grant/*') ) {
my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,$blksize,$blocks)
= stat($file);
printf("%-40s %8u bytes\n", $file, $size);
}
【讨论】:
ls以外的命令,但是在用户实际要调用ls的情况下,这个答案应该得到认可,因为它回答了用户的意图而不是他们的实际问题。
您可以通过多种方式从 Perl 脚本调用 shell 命令,例如:
ls 捕获输出并返回给您。请参阅此处的 #17:Perl programming tips
【讨论】:
我一直使用system和qq在perl里面运行linux程序。而且效果很好。
#!/usr/bin/perl # A hashbang line in perl
use strict; # It can save you a lot of time and headache
use warnings; # It helps you find typing mistakes
# my keyword in Perl declares the listed variable
my $adduser = '/usr/sbin/adduser';
my $edquota = '/usr/sbin/edquota';
my $chage = '/usr/bin/chage';
my $quota = '/usr/bin/quota';
my $nomeinteiro;
my $username;
my $home;
# system() function executes a system shell command
# qq() can be used in place of double quotes
system qq($adduser --home $home --gecos "$fullname" $username);
system qq($edquota -p john $username);
system qq($chage -E \$(date -d +180days +%Y-%m-%d) $username);
system qq($chage -l $username);
system qq($quota -s $username);
【讨论】: