から呼び出されたときに実行されません:Perlスクリプトは、私は別の文字列を置き換えるPerlスクリプトを実行していたターミナルで実行しますが、Javaプログラム
perl -pi.back -e 's/str1/str2/g;' path/to/file1.txt
私は端末からこのコマンドを実行すると、それはうまくすべて置き換え指定されたファイル内のstr1
の出現はstr2
になります。私は、Javaからこれを実行すると、ファイルにアクセスしたが何の交換は行われません:
Runtime.getRuntime().exec("perl -pi.back -e 's/str1/str2/g;' path/to/file1.txt");
- 私はそれが(ファイルをgeditの中で編集しているように見える()必要なリロード)ファイルにアクセスすると確信しています。
- Java
ProcessBuilder
クラスを試しましたが、同じ結果が発生します。 Runtime.exec()
またはProcessBuilder
と他のコマンド(gedit newFile.txt
など)を使用すると、正常に動作します。- 皮肉なことに、私はjavaから上記のperlコマンドを印刷し、端末に貼り付けて置き換え操作が完了しました!
- これらのコマンドを使用した例外またはエラーはありません。 (私はこれを確実にするために試してキャッチを使用した)。
- また、cmdに
perl
の代わりに/usr/bin/perl
を使用して、perl cmdが確実に実行されるようにしました。
だから、問題は何だと思いますか?
EDIT:
私はJavaでコマンドから引用符を削除することによってこの問題を解決しました。 @ikegamiに助けてくれてありがとう。 ので、作業バージョンは次のとおりです。代わりに
perl -pi.back -e 's/str1/str2/g;' path/to/file1.txt
'exec()'はプロセスを返します。プロセスが生成する出力を返す 'getInputStream()'と 'getErrorStream()'メソッドを持っています。このプロセスが出力するものを参照してください。 –
OSによっては、あなたのJavaプログラムがPerlへのパスを持っていない可能性があります。 Perlバイナリに完全なパスを入れる必要があります。これは唯一の方法ではありませんが、最も簡単な方法の1つです。 – octopusgrabbus
@DenisTulskiy私はすでにこれをしました。彼らは何も出力しません。 – a90