如何使用Perl获取bash内置命令

时间:2011-05-23 21:24:50

标签: linux perl

我想知道是否有办法用perl脚本获取Linux命令。我在谈论cd ls ll clear cp

等命令

4 个答案:

答案 0 :(得分:6)

您可以通过多种方式执行系统命令,有些方法比其他方式更好。

  • 使用system();打印输出命令,但不将输出返回给Perl脚本。
  • 使用反引号(``),它不会打印任何内容,但会将输出返回给Perl脚本。使用实际反引号的另一种方法是使用qx();函数,它更容易阅读并完成同样的事情。
  • 使用与exec();完全相同的system();,但根本不返回Perl脚本,除非该命令不存在或失败。
  • 使用open();,它允许您将脚本的输入管道传输到命令,或者将命令的输出读入脚本。

值得一提的是,您使用Perl本身的内置函数可以更好地完成列出的系统命令,如cpls。任何系统调用都是一个缓慢的过程,因此当期望的结果很简单时使用本机函数,比如复制文件。

一些例子:

# 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");

This page更详细地解释了您可以进行系统调用的不同方式。

答案 1 :(得分:2)

正如voithos所说,你可以使用system()或反引号。但是,请注意不建议这样做,,例如,cd将无效(实际上不会更改目录)。请注意,这些命令在 new shell中执行,不会影响正在运行的perl脚本。

我不会依赖这些命令并尝试在Perl中实现您的脚本(如果您决定使用Perl,无论如何)。事实上,Perl最初被设计为sh和其他UNIX系统管理员shell的强大替代品。

答案 2 :(得分:0)

你可以在后面的刻度中包围命令
  `command`

答案 3 :(得分:0)

问题是perl试图执行bash内置(即source,...),好像它们是真实文件一样,但是perl找不到它们,因为它们不存在。答案是告诉perl明确执行什么。对于像source这样的bash内置函数,请执行以下操作,它可以正常工作。

my $XYZZY=`bash -c "source SOME-FILE; DO_SOMETHING_ELSE; ..."`;

对于cd的情况,请执行以下操作。

my $LOCATION=`bash -c "cd /etc/init.d; pwd"`;