我有以下 Perl 脚本(尽管这适用于 Python 和其他脚本语言):script1.pl
, script2.pl
,script3.pl
这些脚本的编写方式是,用户使用输入标志执行它们,输出是保存的文件。
perl script1.pl --i input1.tsv ## this outputs the file `outputs1`
perl script2.pl --i outputs1 ## this outputs the file `outputs2`
perl script3.pl --i outputs2 ## this outputs the file `final_output`
现在,我想创建一个可执行的 bash 脚本,允许用户简单地使用input1
并获取输出作为回报final_output
。
以下是我如何仅使用一个 Perl 脚本来完成此操作execute.sh
:
#!/bin/sh
source ~/.bash_profile
FLAG1="--i=$1"
perl script1.pl $FLAG1
可以在命令行上运行execute.sh input1.tsv
对于我的三个脚本的示例,我如何将中间输出通过管道传输到中间脚本中以创建一个execute.sh
脚本,例如outputs1
into script2.pl
,然后outputs2
intoscripts3.pl
等?
有没有办法让我在不重写 perl/python 脚本的情况下做到这一点?
答案1
你写的 3 行来展示你想要什么是有效的bash
脚本:脚本只不过是 shell 依次执行的一系列命令。
您可能需要的唯一附加代码是清理script1.pl
和生成的临时文件script2.pl
。此外,您可能希望使用绝对路径来指定所在script{1,2,3}.pl
位置。
#!/bin/sh
trap 'rm outputs1 outputs2' EXIT
perl script1.pl --i "$1"
perl script2.pl --i outputs1
perl script3.pl --i outputs2
$1
表示传递给脚本的第一个参数的值,因此将使用以下命令调用它
execute.sh input1.tsv
如预期的。
您无法真正在三个脚本之间设置管道,因为它们似乎是硬编码的以生成特定的输出文件。
答案2
假设输出文件是在本地创建的,即。在脚本所在目录中,您可以尝试在临时工作目录中运行脚本,您可以在执行脚本之前将脚本复制到该目录中,并且其他进程不会在该目录中创建文件。然后您将能够控制和操作由特定脚本创建的新文件。
/tmp
您可以在活动用户目录中创建临时目录。在脚本末尾添加一条将拆除目录的命令。如果您希望将任何输出文件保存在其他地方,您可以在正确的时间将它们复制到正确的位置。