[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00267] Re: metacharacter interpretation in interactive commands
- Subject: [FDclone-users:00267] Re: metacharacter interpretation in interactive commands
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Fri, 21 May 2004 01:25:53 +0900
しらいです。
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 ----
しらい たかし