如何在 Perl 的另一个 bash 提示符下执行命令?

How to execute the command in another bash prompt in Perl?

我正在研究 CnvPytor 并尝试使用 Perl 自动执行一些命令。但它不起作用,因为当我给出第一个命令时,它会进入另一个 bash 提示符 (cnvpytor)。请参考下面的截图,

我已经写了下面的脚本,但是它不起作用

$x = `cnvpytor -root s1.pytor -view 10000`;     #normal bash
$x = `set Q0_range -1 0.5`;                     # this and after this, enter into the cnvpytor
$x = `set p_range 0 0.0001`;
$x = `set p_N 0 0.5`;
$x = `set print_filename s1_output.vcf`;
$x = `set annotate`;
$x = `print calls`;
$x = `quit`;

每个反引号对 运行 是一个单独的进程。

我不知道 CnvPytor 是什么(你提供的 link 也没什么用),但通常的方法是 运行 使用某种 [=10] 的外部工具=] 与之通信。

如果您不需要命令的输出,请使用:

open(PIPE, '|cnvpytor -root s1.pytor -view 10000');
print PIPE <<'EOF';
set Q0_range -1 0.5
set p_range 0 0.0001
set p_N 0 0.5
set print_filename s1_output.vcf
set annotate
print calls
quit
EOF
close(PIPE);

如果您确实需要命令的输出,您可以将 cnvpytor 命令写入一个文件,然后执行:

open(INPUT, 'cnvpytor -root s1.pytor -view <filename |');
while (<INPUT>) {
     # Do something with each line of output
}
close(INPUT);
unlink('filename');

其中“文件名”是带有输入的临时文件。

不需要临时文件,如果您不介意使用 shell,您仍然可以使用反引号来完成。这也将允许您捕获 cnvpytor 命令的输出,如果有的话。以下是我的做法:

my $output = `cnvpytor -root s1.pytor -view 10000 2>&1 <<EOT
set Q0_range -1 0.5
set p_range 0 0.0001
set p_N 0 0.5
set print_filename s1_output.vcf
set annotate
print calls
quit
EOT`;

2>&1 将 STDERR 重定向到 STDOUT,这将导致它在 $output 中被捕获。我觉得使用反引号通常是个好主意。