使用perl变量执行系统

时间:2014-10-28 17:22:27

标签: perl system

我想在perl脚本中执行bash命令。我知道怎么做,但是,当我尝试将命令保存在变量中然后执行它时...我有问题。

这完全符合我的perl脚本:

system("samtools", "sort", $file, "01_sorted.SNP");

这不起作用,我想知道为什么,以及如何解决......:

my $cmd = "samtools sort $file 01_sorted.SNP";
print "$cmd\n";  # Prints the correct command BUT...
system($cmd);

ERROR:

open: No such file or directory

任何帮助将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:10)

后一个片段中有注入错误。这就是说,当你构建shell命令时,你忘了将$file的值转换为产生$file值的shell文字。这非常令人满意,所以我将在下面说明这意味着什么。


$file包含a b.txt

my @cmd = ("samtools", "sort", $file, "01_sorted.SNP");
system(@cmd);

相当于

system("samtools", "sort", "a b.txt", "01_sorted.SNP");

执行samtools,并将三个字符串sorta b.txt01_sorted.SNP作为参数传递给它。


my $cmd = "samtools sort $file 01_sorted.SNP";
system($cmd);

相当于

system("samtools sort a b.txt 01_sorted.SNP");

执行shell,将字符串作为执行命令传递。

反过来,shell将执行samtools,传递四个字符串sortab.txt01_sorted.SNP把它作为论据。

samtools无法找到文件a,因此会出错。


如果您需要构建shell命令,请使用String::ShellQuote

use String::ShellQuote qw( shell_quote );
my $cmd = shell_quote("samtools", "sort", "a b.txt", "01_sorted.SNP");
system($cmd);

相当于

system("samtools sort 'a b.txt' 01_sorted.SNP");

执行shell,将字符串作为执行命令传递。

反过来,shell将执行samtools,将三个字符串sorta b.txt01_sorted.SNP作为参数传递给它。

答案 1 :(得分:1)

错误open: No such file or directory看起来不像perl打印的错误,因为system不会为您打印任何错误。这可能是samtools打印的,所以只需检查您的文件名 - $file01_sorted.SNP是否正确且文件是否存在。此外,如果$file包含空格,请将其名称放在命令行中的引号中。或者,更好的是,按照评论中的建议使用system(@args)

如果您没有任何想法,请使用strace

运行您的脚本
strace -f -o strace.log perl yourscript.pl

并检查strace.log以查看哪个open调用失败。