2011-11-29 159 views
1

如何将命令发送到perl脚本中的终端?从脚本向终端发送命令

例如,如果我想在控制台中运行命令mkdir $directory,我该在perl脚本中输入什么内容?

+0

http://www.perlhowto.com/创建在当前工作目录一个目录执行expire_commands我相信应该有所帮助 – Joe

回答

4

建模关闭文档中的代码示例在http://perldoc.perl.org/functions/system.html

@args = ("mkdir", $directory); 
system(@args) == 0 
    or die "mkdir failed"; 

Perl可以使目录,而system()电话,但我相信你想要做其他的东西,只是使用的mkdir作为一个例子。

+0

也可以在命令周围使用反引号来捕获输出,如果你需要的话(例如$ i ='cat foo.txt'将foo.txt的内容放入$ i) – Nialscorva

+4

@Nialscorva:或者'如果你需要绕过Markdown'$ i = qx {cat foo.txt}'。 –

4

由于Perl有建于mkdir()系统调用,你并不需要在所有使用system命令:

my $directory = "..."; 
if (mkdir $directory) 
{ 
    croak "Failed to create directory $directory ($!)"; 
} 

如果必须使用system,这样做的安全方法:

if (system "mkdir", $directory) 
{ 
    croak "Failed to create directory $directory"; 
} 

这种形式的system语句(带有参数列表)避免了shell扩展的问题。

+0

还有File :: Path软件包,它一次可以创建或删除多个关卡。 –

0

使用perl命令而不是依赖shell命令。 perl可以做很多事情,如果它不是built incore module,它可能在CPAN上可用。

正如人们所提到的,mkdir可用,所以大多数basic file related commands

话虽这么说,这里的shell命令的污垢在Perl:

你想要的所有Perl脚本:

  • 等待在执行shell命令并检查其退出状态。 使用system
  • 等待并捕获shell命令的标准输出。使用qx//或 反引号。
  • 放弃perl脚本来运行另一个命令。使用 exec。但通常情况下,您不会真的想要使用exec,因为上述链接中描述的 原因。
  • 运行系统命令和管道输入或输出到/从它。使用 open和MODE分别为-||-
+0

应该强调的是'exec'不会返回到调用程序,即运行perl代码的perl进程被'exec''程序替代。这意味着调用'exec'后的代码永远不会执行,除非exec不能调用程序。 –

+0

@danielkullmann好点。我从来没有真正使用'exec',除了学习从未使用它,大约10-15年前。 =) – TLP

5

对于从Perl脚本执行任意系统命令,你需要使用系统命令用反引号

为电子商务。摹

在你的情况,用于创建你需要输入

系统(mkdir $directory)目录; #note HTML是不显示的反引号,但反引号是发生之前的mkdir和$目录后

它将在$目录的名称