トップ «前の日記(2006-01-11) 最新 次の日記(2006-01-13)» 編集

jFD開発したりしなかったり日誌

2004|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|
2006年
1月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

2006-01-12 [長年日記]

_ 爆睡

21時過ぎ家に帰り着き、1日前の乾いた米でカレーを食べ、

布団にもぐりこんだらあっという間に寝てた。

さすがに睡眠時間が3時間割ると早いわ。

午前4時くらいに目が覚めて、風呂を立ててゆっくり浸かり、

多少コードをいじってまた睡眠。

まだまだ寝足りない。

_ びいさんへ回答

昨日のRuntime.execの件。

パラメータ付きで外部コマンドを呼び出す際に、実行の形式を工夫しないと

うまく実行できないようです。

うちのLinux環境(Fedora Core4、Java 1.5.0_04-b05)で"ls -l"を

色々形式を変えて実験してみました。

1、
Runtime.getRuntime().exec("/bin/sh -c ls -l", null, dir);
 ls(パラメータ抜き)が実行される。
 
2、
Runtime.getRuntime().exec("/bin/sh -c \"ls -l\"", null, dir);
 エラーが表示されて実行されない。
 
3、
String[] strs = {
	"/bin/sh",
	"-c",
	"ls -l"
};
Runtime.getRuntime().exec(strs, null, dir);
 ls -lが実行される。
 
4、
String[] strs = {
	"/bin/sh",
	"-c",
	"\"ls -l\""
};
Runtime.getRuntime().exec(strs, null, dir);
 エラーが出て実行されない。

_ 正直なところ、どういうルールでこうなるのかいまいちわかってません。

2は普通にターミナルから実行すれば動くので、

「バグなんじゃねえの?」

とひそかに疑っています。

_ HtmlTablePanel

少しだけバージョンアップしました。

一部コンストラクタの可視性変更(通常使わない物がpublicになっていた)と、

Javadocの整理をして抜けを埋めただけです。

ついでにJavadocもWebから見られるようにしました。

クラスは9個あるけれど、HtmlTablePanelクラスだけ見てもらえば

わかるように出来てます。

お試しあれ。

本日のツッコミ(全6件) [ツッコミを入れる]
_ びい (2006-01-13 15:53)

Runtime.getRuntime().exec("/bin/sh -c \\"ls -l\\"", null, dir);
だと動きませんか?
このマシンにJDK系を入れていないのでアレですが、Runtime#exec は文字列をそのままshellに渡しているような気がします。
つまり
$ /bin/sh -c "/bin/sh -c "ls -l""
みたいなものを実行しているのではないかと。2のケースがこれに該当すると思うのですが、手元でbashから実行すると ls (-l抜き) が実行されました。Runtime経由でエラーになるのが不可解。
$ /bin/sh -c "/bin/sh -c \"ls -l\""
だとls -lが実行されたので、shに \" の形で渡すか、最初からshellを付けない(Runtimeが付けてくれることに期待)というのがスジのように思えます。

_ Shunji (2006-01-15 18:37)

まだ調査継続中なんですが、シェルをつけずにls -lは正常に動くみたいです。
どうも何もしないでもデフォルトのシェルに渡してくれるみたいですね。
昔のJVMだとシェルを付けないとパイプやシェル固有のコマンドが使えないという問題があったんですが(どうもシェル経由じゃなかったらしいです)、現在のJVMでは改善されているみたいですね。

あと、"を\"で渡す形式ですが、試してみたんですがダメでした。
ここら辺、やっぱりよくわかりません。

_ K.Takata (2006-01-17 01:00)

String[] cmd = {"sh", "-c", "ls", "-l"};
だとダメですね。コマンドラインから試してみると、
sh -c ls -l だとダメで、sh -c 'ls -l' なら Ok。
で、Runtime.exec(String) のソースを見ると、
StringTokenizer でばらして、Runtime.exec(String[]) に渡しているので、
ls と -l が別の配列要素になってしまってダメと。

_ Shunji (2006-01-17 16:17)

こちらもソース確認してみました。
本当に何も考えずStringTokenizerでぶった切ってるだけなんですね、これ・・・
クォートとかのエスケープくらいサポートして欲しかったなあ。
逆にWindowsでなんで動いてるのか不思議です。

_ K.Takata (2006-01-17 20:27)

Windows では、コマンドラインはスペースで区切られた
単一の文字列で渡すようになっています。
StringTokenizer でばらしても、結局スペースで
くっつけられて渡されるはずです。
Unix はよく分かりませんが、おそらく配列のまま、
あるいは、'\0' 区切りなどで渡されるのでしょう。

_ Shunji (2006-01-18 00:43)

なるほど。
初めて納得が行きました。

本日のリンク元
その他のリンク元
検索