3

したがって、私のスクリプトでは、unixを呼び出す必要があり、次のようにシステムコマンドを使用して呼び出します。

system "bash -i -c 'addmothernode'";

...

perl code ...

...

system "bash -i -c 'addnode -ip=$_'";

ただし、これらのコマンドの両方を同じスクリプトで実行すると、何らかの理由でプロセスが次のように停止します。

[1]+  Stopped                 perl boot.pl

そして、スクリプトは私が実行したときにのみ終了することができますfg %1。これらのシステムコールの1つだけを呼び出すと、perlスクリプトは正常に終了します。しかし、お互いに依存しているので、両方のコマンドが必要です。誰が何が起こっているのかについて何か考えがありますか?ありがとう!

アップデート:

以下の多くの回答は、システムコマンドを実行するために使用する必要はないと言っていますbash -i。通常、これは正しいことですが、作成したエイリアスを使用する必要があります。これを使用しない場合、エイリアスは使用されません。認識された。だから私は必要bash -iです。

4

3 に答える 3

4

この問題はperlとは関係ありません。インタラクティブモード(-i)で2つのバッシュを次々に開始すると、状況を簡単に再現できます。

$ 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
于 2012-07-03T08:05:37.637 に答える
2

bash -i対話型シェルを実行する手段。したがって、端末から読み取る 2 つのシェルがあります。

-iオプションを削除してみてください。

于 2012-07-03T06:36:53.740 に答える
2
system "addmothernode"; 

動作するはずです。


コマンドを実行するために、bash は必要ありません。Perlsystem関数はシステム C 関数に似ており、デフォルトで を呼び出しますsh

男系

エグゼクティブ

呼び出し元が準拠する標準によって、使用されるシェルが決まります。standard(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
于 2012-07-03T07:30:43.097 に答える