[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00267] Re: metacharacter interpretation in interactive commands



 しらいです。

In Message-Id <86u0ydrneg.knu@iDaemons.org>
        "Akinori MUSHA" <knu@iDaemons.org>さんwrites:
>  {LOG,MAKE}_DIR, {COPY,MOVE,PACK,FIND}_FILE 等の内部コマンドに
> 共通していますが、入力した文字列においてメタ文字が解釈されるので、
> たとえば「a'b」と入力しても「ab」として扱われてしまいます。一方、
> RENAME_FILE では解釈されないので、食い違いが少し気になります。

 非対称なのは RENAME_FILE だけ meta character 処理を忘れて
いただけの話で、仕様としてはここは「解釈する」が正解です。
 ここで入力された文字列は、「~」や環境変数を展開してから評
価することになってますので、その抑制のために escape 文字なり
quote なりが必要になります。
 RENAME_FILE の方は直しておきましょう。


>  それが仕様ということでもいいんですが、その場合も、ヒストリで
> 呼び出された文字列がエスケープされていないのは不便だと思います。
> 「さっきの[メタ文字を含む]ディレクトリにこれもコピーしよう」と
> いうときに、ヒストリから呼び出した文字列をそのまま確定すると、
> 意図しない名前のディレクトリができてコピーされてしまいます。

 directory history は、入力文字列ではなくて system call に
渡された文字列が保存されてます。current directory など、入力
文字列ではない値も保存されますので。
 ということで、ここで保存する際に実際のパス名に対して meta
character を escape してから保存するという仕様ではどうでしょ
うか?
 パス名補完の際にも同じような escape を施していますので、仕
様としては特に違和感もないと思いますが。

 普通はパス名に meta character なんか滅多に使いませんから、
必要以上に凝った処理にはしたくないですね。

---- Cut Here ----
diff -u old/command.c new/command.c
--- old/command.c	Sat Apr 24 02:30:35 2004
+++ new/command.c	Fri May 21 00:20:49 2004
@@ -1239,7 +1239,7 @@
 	}
 	else for (;;) {
 		file = inputstr(NEWNM_K, 1, 0, filelist[filepos].name, -1);
-		if (!file || !*file) return(1);
+		if (!file || !*(file = evalpath(file, 1))) return(1);
 		if (Xaccess(file, F_OK) < 0) {
 			if (errno == ENOENT) break;
 			warning(-1, file);
diff -u old/shell.c new/shell.c
--- old/shell.c	Sat Apr 24 01:48:23 2004
+++ new/shell.c	Fri May 21 00:17:31 2004
@@ -1567,6 +1567,7 @@
 	}
 
 	if (!s || !*s) return(0);
+	s = (n == 1) ? killmeta(s) : strdup2(s);
 
 	if (histno[n]++ >= MAXHISTNO) histno[n] = (short)0;
 
@@ -1583,7 +1584,7 @@
 
 	if (history[n][size]) free(history[n][size]);
 	for (i = size; i > 0; i--) history[n][i] = history[n][i - 1];
-	history[n][0] = strdup2(s);
+	history[n][0] = s;
 	return(1);
 }
 
---- Cut Here ----

                                               しらい たかし