如果命令行包含元字符,Emacs“shell-command-on-region”不会将 STDIN 传递给命令

如果命令行包含元字符,Emacs“shell-command-on-region”不会将 STDIN 传递给命令

我在 Windows-XP SP3 上运行 Emacs,GNU Emacs 22.3.1 (i386-mingw-nt5.1.2600),2008-09-07,SOFT-MJASON 上

当我运行参数包含 shell 元字符的命令时,我的 Emacs 区域不会按预期通过 STDIN 传递给命令。我编写了一个程序来验证是否确实如此:

## test.pl
my $lines = 0;
while (<STDIN>)
{
    ++$lines;
}

print "Input lines: $lines\n";

for (my $i = 0; $i < @ARGV; ++$i)
{
    print "$i: [[$ARGV[$i]]]\n";
}

例如,如果该区域包含:

a
b

然后我运行:perl c:\bin\test.pl "<",得到结果:

Input lines: 0
0: [[<]]

如果我运行:perl c:\bin\test.pl "-",我会得到:

Input lines: 2
0: [[-]]

我的 Emacs 中的 SHELL 环境变量设置为 c:/emacs/bin/cmdproxy.exe

在我开始运行最新版本的 Emacs 之前,这从来都不是问题。有人知道如何解决这个问题吗?(我不想使用任何 cygwin shell 作为我的 emacs shell)
编辑:
我使用的包含 shell 元字符的任何 test.pl 参数都与使用“<”具有相同的效果。例如,传递“foo&”也会导致“输入行:0”

类似地,我使用 test.pl 的任何参数才不是包含 shell 元字符与使用“-”具有相同的效果。例如,传递“foo”也会导致“输入行:2”

答案1

使用<指示要从命名的子进程重定向文件,而 Emacs 并未提供此功能。这就是您获得 0 个输入行的原因。

使用-指示子进程应该在 上接收输入stdin,Emacs供应,并且外壳正在正确计算2行。

相关内容