如何在 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
中被捕获。我觉得使用反引号通常是个好主意。
我正在研究 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
中被捕获。我觉得使用反引号通常是个好主意。