(tcsh)xterm标题栏的postcmd别名breaks-less文本编辑器



我设置了我的tcsh-xterm,用运行的最后一个命令的名称和目录更新"postcmd"上的标题栏。

这与我所拥有的类似(复制的最小示例):

alias postcmd 'echo -n "33]0;hello_world07";'

(注意,这个别名在我的.cshrc文件中。如果我只是在命令行上键入它,它就会100%正常工作)

这成功地将xterm标题栏更新为在我运行的每个命令之后显示"hello_world",除了less。当我运行less时,我得到以下终端输出:

>less abc.txtESC]0;hello_world^GESC]0;hello_world^GESC]0;hello_world^GESC]0;hello_world^GESC]0;hello_world^GESC]0;hello_world^GESC]0;hello_world^GESC]0;hello_world ^GESC]0;hello_world^GESC]0;hello_world^GESC]0;hello_world^GESC]0;hello_world^GESC]0;hello_world^G... (END)

这个文件从来没有真正打开过,它只是打印这个垃圾字符串,我必须用CTRL-C来取消它。bell或escape字符是不是以某种方式扰乱了less的初始化?知道我如何修改它以不破坏less吗?我可以很容易地使用另一个编辑器,但有时我需要与其他工程师共享我的控制台进行调试,如果他们选择运行less,我不想混淆他们。

这是我正在使用的实际代码,它与简单的hello_world示例有相同的问题:

alias postcmd 'set HIST = `history -h 1`; printf "33]0;%s07" "xterm: $HIST @ $cwd ";'

=====编辑=====一些附加信息:

> alias less
> echo $LESS
LESS: Undefined variable
> echo $TERM
xterm
>less --version
less 382
Copyright (C) 2002 Mark Nudelman
less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Homepage: http://www.greenwoodsoftware.com/less
>tcsh --version
tcsh 6.13.00 (Astron) 2004-05-19 (x86_64-unknown-linux) options 8b,nls,dl,al,kan,rh,color,dspm,filec

===更多编辑===

在进一步的调试中,我发现只有当我把命令放在.cshrc文件中时,问题才会出现。如果我取消对.cshrc中的别名的注释,并简单地在命令行上键入别名,那么它可以使用较少的别名。

此外,在我的.cshrc中放入别名后,如果我取消别名,即使在取消别名后,它也会中断较少。因此,问题似乎不是来自别名的存在,而是在终端创建时执行.cshrc时被别名化?

根据此链接,该问题仅存在于Red Hat机器上

从他们的网站:

"less"命令

当我尝试使用less命令,而不是查看文件的内容时,我会看到通常只有在登录时才会看到的消息。如何解决此问题

如果主目录中的.cshrc、.profile或任何其他shell启动文件打印任何文本,less将显示该文本而不是您的文件。为了消除这种行为,请测试是否可以在实际打印任何内容之前写入标准输出。例如,假设您使用的是tcshshell,并且在.cshrc文件中放入了以下语句:

echo ".cshrc here"
echo "I am logged on to machine $hostname"

替换为:

 # "-t 1" is true only if standard output is enabled;
 # if not, then don't write any messages.
 if ( -t 1 ) then                                              
    echo ".cshrc here"
    echo "I am logged on to machine $hostname"
 endif

sh风格外壳中的等效测试:

 if [ -t 1 ]; then
    echo ".profile here"
    echo "I am logged on to machine $hostname"
 fi

常见问题解答中的常见问题解答:为什么less会这样做

在RedHat Linux中,less除了显示纯文本外,还提供了显示其他类型文件的功能。例如,如果您键入:

less ${NevisAppBase}/src/archive-tar/gcc-2.95.2.tar.gz

您将在gcc-2.95.2.tar.gz中看到压缩文件的列表,而不是二进制垃圾。然而,要启用此功能,less必须调用一个子shell。如果该子shell向标准输出写入任何内容,您将看到该输出而不是您的文件。

根据评论中的讨论,我不知道是什么原因导致了问题,但我已经想出了一个解决方法。

我自己无法重现这个问题,即使使用tcsh 6.13.00(相当旧,BTW)。

但是,从.login或从.login来源的文件创建别名似乎可以避免这个问题。

在我自己的实验中,我将postcmd别名为一个命令,该命令使用高分辨率时间戳更新xterm标题栏。使用在我的.cshrc中定义的别名,标题栏会随着shell的启动而快速更新,这表明即使在执行init脚本时,也会在第一个交互式提示出现之前执行postcmd。(将postcmd别名为将信息附加到日志文件中的东西可以帮助追踪这一点。)

由于.login来源于.cshrc之后的,因此将别名定义移动到.login意味着在别名有效的情况下执行的命令更少。无论如何,这不是一个坏主意;除了登录shell之外,您可能不需要别名。

我的猜测是,您的一个启动脚本中的某些内容与您的postcmd别名交互,从而扰乱了您的终端设置。如果您感兴趣,可以尝试将别名定义放在.cshrc中的不同位置,看看是什么命令触发了问题。(分而治之的方法意味着你不必进行大量的试验。)

看看这个问题在tcsh的后续版本中是否仍然存在会很有趣。它很可能是一个tcsh错误,但我在http://bugs.gw.com/.

最新更新