所以在我的脚本中我需要调用unix,我是通过系统命令来完成的,如下所示:
system "bash -i -c 'addmothernode'";
...
perl code ...
...
system "bash -i -c 'addnode -ip=$_'";
但是,每当我在同一个脚本中运行这两个命令时,由于某种原因,我的进程就像这样停止:
[1]+ Stopped perl boot.pl
只有在我运行fg %1
时才能完成脚本。当我只有其中一个系统调用时,perl脚本成功完成。但我需要两个命令,因为它们相互依赖。有什么想法发生了什么?谢谢!
更新:
下面的很多答案都说我不需要使用bash -i
来运行系统命令,我知道通常这是真的,但我需要使用我创建的别名,如果我不这样做使用此别名将无法识别。所以我确实需要bash -i
。
答案 0 :(得分:4)
这个问题与perl无关。如果您一个接一个地在交互模式(-i
)中开始两个骰子,您可以轻松地重现这种情况:
$ cat 1.sh
bash -i -c 'sleep 1'
bash -i -c 'sleep 1'
$ bash 1.sh
[1]+ Stopped bash 1.sh
当然最好在非交互模式下运行bash(没有-i
)或直接运行程序,而不用bash,但如果因某些原因bash -i
需要,你可以保护它与setsid
:
$ cat 1.sh
setsid bash -i -c 'sleep 1'
setsid bash -i -c 'sleep 1'
echo done
$ bash 1.sh
done
答案 1 :(得分:2)
bash -i
表示运行交互式shell;所以你有两个炮弹都从终端读取。
尝试删除-i
选项。
答案 2 :(得分:2)
system "addmothernode";
应该有用。
要执行命令,不需要bash。 Perl system
函数类似于系统C函数,它默认调用sh
。
调用者符合的标准决定了使用哪个shell。请参阅standards(5)。
Standard Shell Used
______________________________________________________________
1989 ANSI C, 1990 ISO C, 1999 ISO C, /usr/xpg4/bin/sh
POSIX.1 (1990-2001), SUS, SUSv2, SUSv3,
XPG4
POSIX.1 (1988), SVID3, XPG3, no standard /usr/bin/sh
specified