我想在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
任何帮助将不胜感激,谢谢!
答案 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
,并将三个字符串sort
,a b.txt
和01_sorted.SNP
作为参数传递给它。
my $cmd = "samtools sort $file 01_sorted.SNP";
system($cmd);
相当于
system("samtools sort a b.txt 01_sorted.SNP");
执行shell,将字符串作为执行命令传递。
反过来,shell将执行samtools
,传递四个字符串sort
,a
,b.txt
和01_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
,将三个字符串sort
,a b.txt
和01_sorted.SNP
作为参数传递给它。
答案 1 :(得分:1)
错误open: No such file or directory
看起来不像perl打印的错误,因为system
不会为您打印任何错误。这可能是samtools
打印的,所以只需检查您的文件名 - $file
和01_sorted.SNP
是否正确且文件是否存在。此外,如果$file
包含空格,请将其名称放在命令行中的引号中。或者,更好的是,按照评论中的建议使用system(@args)
。
如果您没有任何想法,请使用strace
:
strace -f -o strace.log perl yourscript.pl
并检查strace.log
以查看哪个open
调用失败。