问题描述
|
我想知道是否有办法用perl脚本来获取Linux命令。我说的是诸如“ 0”之类的命令
解决方法
您可以通过多种方式执行系统命令,有些方式比其他方式更好。
使用
system();
打印命令的输出,但不将输出返回到Perl脚本。
使用反引号(``),不输出任何内容,但将输出返回到Perl脚本。使用实际反引号的另一种方法是使用qx();
函数,该函数更易于阅读并完成相同的操作。
使用exec();
,它与system();
的功能相同,但是除非命令不存在或失败,否则根本不会返回Perl脚本。
使用open();
,您可以将脚本中的输入传递给命令,也可以将命令的输出读入脚本。
重要的是要提到,使用Perl本身的内置函数可以更好地完成您列出的系统命令(如cp
和ls
)。任何系统调用都是一个缓慢的过程,因此,当所需的结果很简单时(例如复制文件),请使用本机函数。
一些例子:
# Prints the output. Don\'t do this.
system(\"ls\");
# Saves the output to a variable. Don\'t do this.
$lsResults = `ls`;
# Something like this is more useful.
system(\"imgcvt\",\"-f\",\"sgi\",\"-t\",\"tiff\",\"Image.sgi\",\"NewImage.tiff\");
该页面更详细地说明了进行系统调用的不同方法。
,正如voithos所说,您可以使用ѭ9或反引号。但是,请考虑到不建议这样做,例如,“ 10”将不起作用(实际上不会更改目录)。请注意,这些命令在新的Shell中执行,不会影响正在运行的perl脚本。
我不会依赖那些命令并尝试在Perl中实现您的脚本(如果您仍然决定使用Perl)。实际上,Perl最初被设计为可以替代sh和其他sysadmins的UNIX shell。
,您可以将命令括在中间
`命令`
,问题是perl试图执行内置的bash(即source
...),就好像它们是真实文件一样,但是perl找不到它们,因为它们不存在。答案是告诉perl明确执行什么。对于bash内置函数,例如source
,请执行以下操作,它就可以正常工作。
my $XYZZY=`bash -c \"source SOME-FILE; DO_SOMETHING_ELSE; ...\"`;
对于ѭ10的情况,请执行以下操作。
my $LOCATION=`bash -c \"cd /etc/init.d; pwd\"`;