- PR -

runtimeからのAIXコマンド実行

1
投稿者投稿内容
未記入
会議室デビュー日: 2004/10/27
投稿数: 4
投稿日時: 2004-10-27 22:35
現在AIX上でservletを動かしています。
処理の中でファイルの移動をや、
オーナー変更等のAIXコマンドを実行する必要があります。

mvコマンドをruntimeクラスを使って実行しています。
このコマンドを実行する時に対象のファイルパスにスペースが含まれる事があり、
ダブルクォーテーション、
又はシングルクォーテーションを付けて回避しようとしているのですが、
runtimeからパスをダブルクォーテーションやシングルクォーテーション
で囲んだコマンドを実行すると、
パスが見つからないというエラーになってしまいます。

何か解決方法があったらお教えください。
よろしくお願いいたいます。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-10-27 23:48
未記入さん、こんにちは。

java.lang.Runtime#exec()ですね?
もしかして、文字列の引数1個の exec()を使用しているのでしょうか?
文字列の配列を渡す方法ではうまく行くのではないでしょうか?
未記入
会議室デビュー日: 2004/10/27
投稿数: 4
投稿日時: 2004-10-28 10:05
はい現在は配列をの方は使っていません。
説明が足りませんでしたが、何故ダブルクォートを使用しているかと言いますと、
コマンドを実行する対象ファイルパスにスペースが入るからなのです。

実行されるコマンドは、
mv "/xxx/xxx/xx x.txt" "/yyy/yyy/yy y/"

のように実行される必要があるのです。
JW
常連さん
会議室デビュー日: 2004/01/14
投稿数: 49
投稿日時: 2004-10-28 10:29
引用:

未記入さんの書き込み (2004-10-28 10:05) より:
はい現在は配列をの方は使っていません。
説明が足りませんでしたが、何故ダブルクォートを使用しているかと言いますと、
コマンドを実行する対象ファイルパスにスペースが入るからなのです。

実行されるコマンドは、
mv "/xxx/xxx/xx x.txt" "/yyy/yyy/yy y/"

のように実行される必要があるのです。



Runtime.exec()がなぜオーバライドされているか見てみた方が。
Runtime.exec(String) の引数一つのものは渡した文字列に「"」や「'」が有ろうが無かろうがともかく空白があればそこでコマンドを分割してRuntime.exec(String[],,)に投げなおします。
だから勝手に分割されないようにRuntime.exec(String[])側を呼ぶ必要があります。最終的にnativeメソッドにわたった際、コマンドと引数の組だと認識してくれるはずで、コマンドラインに「"」が付いているかどうかなどは別問題です。(native側がおかしくなければ、ですが)

#空白で引数を区切ったり「"」で囲むと一つの引数として扱う、と言うのはシェル側の仕事だと思われます。

[ メッセージ編集済み 編集者: JW 編集日時 2004-10-28 10:33 ]
未記入
会議室デビュー日: 2004/10/27
投稿数: 4
投稿日時: 2004-10-28 10:52
配列を使うやり方に変えてみました。

String str[] = {"mv", "\""+strEry[i]+"\"", "\""+strSand[i]+"\""};

この結果
mv "xxx/xxx/xx x.txt" "yyy/yyy/"

というコマンドが実行されるようですが、
パスが見つからないというエラーが返ってきます。
ダブルクォートまで含めてパスとして実行がされてしまっているのではないかと思うのです。
JW
常連さん
会議室デビュー日: 2004/01/14
投稿数: 49
投稿日時: 2004-10-28 10:56
引用:

未記入さんの書き込み (2004-10-28 10:52) より:
配列を使うやり方に変えてみました。
  :
ダブルクォートまで含めてパスとして実行がされてしまっているのではないかと思うのです。


そこまで判っているなら削れば良いと思うのですが。
String str[] = {"mv", strEry[i], strSand[i]};
です。
mvへ引数を渡す際に「"」を解釈するのはシェル。逆にいえばシェルを経由しないので「ここからここまで引数」と指定するために「"」なんかで括る必要はまったくないのです。
未記入
会議室デビュー日: 2004/10/27
投稿数: 4
投稿日時: 2004-10-28 11:06
早い返信本当にありがとうございます。

ダブルクォートを取ってみました

String str[] = {"mv", strEry[i], strSand[i]};

結果、mvに成功しました。
『パスにスペースがあるならダブルクォートで括らなければならない』
という思いに囚われ過ぎていたようです。

ありがとうございました。
植村
会議室デビュー日: 2004/10/28
投稿数: 11
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)