从perl脚本中调用bash脚本

7
我是一名能翻译文本的助手。

我正在尝试在Perl脚本中编写代码,并需要在Bash中调用另一个文件。 不确定哪种方法最好?我可以直接使用system()来调用它吗? 请指导/展示给我一个示例方法。

目前为止,我尝试过:

     #!/usr/bin/perl
     system("bash bashscript.sh");

Bash :

#!/bin/bash
echo "cdto codespace ..."
cd codetest
rm -rf cts
for sufix in a o exe ; do
echo ${sufix}
find . -depth -type f -name "*.${sufix}" -exec rm -f {} \;
done

当我执行perl脚本时,出现了错误:找不到codetest文件或目录

在未预期的记号“do”附近出现语法错误。


1
是的,你可以使用 system("bash -c script.sh"),例如。 - 2r2w
@IgorChubin 你是对的,但如果脚本需要执行,那么 bash -c 也可以。 - 2r2w
我根据 https://dev59.com/LnVC5IYBdhLWcg3wjx5d 解决了我的第一个问题: alias proj="cd /home/tree/projects/java" (感谢 @Greg Hewgill) - iDev
可能是如何在Perl脚本中调用shell命令?的重复问题。 - jww
4个回答

11

如果您只想运行脚本,可以使用反引号或system:

$result = `/bin/bash /path/to/script`;

或者

system("/bin/bash /path/to/script");

如果您的脚本产生了大量的bug数据,最好的运行方法是使用open+pipe:
if open(PIPE, "/bin/bash /path/to/script|") {
  while(<PIPE>){
  }
}
else {
  # can't run the script
  die "Can't run the script: $!";
}

回答不错,但 /bin/sh 可能不是 bash,并且如果是 bash,则会在 --posix 模式下运行。 - jordanm
1
没有必要运行 sh 来启动 bash: system("/bin/bash", "/path/to/script");open(my $PIPE, '-|', "/bin/bash", "/path/to/script") 可以避免这种情况。 - ikegami
也可以只使用 \bash script.sh``。 - 2r2w
@IgorChubin,你的代码末尾的$!是什么作用?我不熟悉Perl。 - MrPickles
@IgorChubin在"/bin/bash /path/to/script|"的末尾是否需要|?那是做什么用的? - MrPickles
@MrPickles:是的,这是必要的。这实际上是主要的重点。如果没有管道符号,您将只打开带引号的文件(它不存在,显然,因为它是一个命令名称)。那么现在$!是什么:那是一个特殊变量,其中包含错误消息。 - Igor Chubin

1

您可以使用反引号来执行命令:

$command = `command arg1 arg2`;

还有其他几种附加方法,包括system("command arg1 arg2")也可以执行它们。

这里有一个很好的在线参考资料:http://www.perlhowto.com/executing_external_commands


1

您可以使用反引号、system() 或 exec。

  system("myscript.sh") == 0
    or die "Bash Script failed";

另请参阅:this 帖子。

反引号在void上下文中...使用system()可以节省一些额外的工作。 - sidyll

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接