- - PR -
runtimeからのAIXコマンド実行
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-10-27 22:35
現在AIX上でservletを動かしています。
処理の中でファイルの移動をや、 オーナー変更等のAIXコマンドを実行する必要があります。 mvコマンドをruntimeクラスを使って実行しています。 このコマンドを実行する時に対象のファイルパスにスペースが含まれる事があり、 ダブルクォーテーション、 又はシングルクォーテーションを付けて回避しようとしているのですが、 runtimeからパスをダブルクォーテーションやシングルクォーテーション で囲んだコマンドを実行すると、 パスが見つからないというエラーになってしまいます。 何か解決方法があったらお教えください。 よろしくお願いいたいます。 | ||||
|
投稿日時: 2004-10-27 23:48
未記入さん、こんにちは。
java.lang.Runtime#exec()ですね? もしかして、文字列の引数1個の exec()を使用しているのでしょうか? 文字列の配列を渡す方法ではうまく行くのではないでしょうか? | ||||
|
投稿日時: 2004-10-28 10:05
はい現在は配列をの方は使っていません。
説明が足りませんでしたが、何故ダブルクォートを使用しているかと言いますと、 コマンドを実行する対象ファイルパスにスペースが入るからなのです。 実行されるコマンドは、 mv "/xxx/xxx/xx x.txt" "/yyy/yyy/yy y/" のように実行される必要があるのです。 | ||||
|
投稿日時: 2004-10-28 10:29
Runtime.exec()がなぜオーバライドされているか見てみた方が。 Runtime.exec(String) の引数一つのものは渡した文字列に「"」や「'」が有ろうが無かろうがともかく空白があればそこでコマンドを分割してRuntime.exec(String[],,)に投げなおします。 だから勝手に分割されないようにRuntime.exec(String[])側を呼ぶ必要があります。最終的にnativeメソッドにわたった際、コマンドと引数の組だと認識してくれるはずで、コマンドラインに「"」が付いているかどうかなどは別問題です。(native側がおかしくなければ、ですが) #空白で引数を区切ったり「"」で囲むと一つの引数として扱う、と言うのはシェル側の仕事だと思われます。 [ メッセージ編集済み 編集者: JW 編集日時 2004-10-28 10:33 ] | ||||
|
投稿日時: 2004-10-28 10:52
配列を使うやり方に変えてみました。
String str[] = {"mv", "\""+strEry[i]+"\"", "\""+strSand[i]+"\""}; この結果 mv "xxx/xxx/xx x.txt" "yyy/yyy/" というコマンドが実行されるようですが、 パスが見つからないというエラーが返ってきます。 ダブルクォートまで含めてパスとして実行がされてしまっているのではないかと思うのです。 | ||||
|
投稿日時: 2004-10-28 10:56
そこまで判っているなら削れば良いと思うのですが。 String str[] = {"mv", strEry[i], strSand[i]}; です。 mvへ引数を渡す際に「"」を解釈するのはシェル。逆にいえばシェルを経由しないので「ここからここまで引数」と指定するために「"」なんかで括る必要はまったくないのです。 | ||||
|
投稿日時: 2004-10-28 11:06
早い返信本当にありがとうございます。
ダブルクォートを取ってみました String str[] = {"mv", strEry[i], strSand[i]}; 結果、mvに成功しました。 『パスにスペースがあるならダブルクォートで括らなければならない』 という思いに囚われ過ぎていたようです。 ありがとうございました。 | ||||
|
投稿日時: 2004-10-28 19:05
% mv "a b c" target 引数1=a b c 引数2=target →"a b c"を"target"にmv % mv a b c target 引数1=a 引数2=b 引数3=c 引数4=target →"a"と"b"と"c"を"target"にmv シェル上で引数に空白を含める場合はダブルクォーテーションが必要。 これはしっかり頭に入れておきましょう。 Windowsのコマンドプロンプトでは C:\> cd Program Files で "C:\Program Files" に移動してくれたりします。 便利なのか余計なお世話なのか・・・。 シェルとプログラムをごっちゃにするのは初心者にありがちですね ![]() |
1