4

我设置了我的 tcsh xterm 以使用运行的最后一个命令的名称和目录来更新“postcmd”上的标题栏。

这类似于我所拥有的(重现的最小示例):

alias postcmd 'echo -n "\033]0;hello_world\007";'

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

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

>less abc.txt ESC]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取消它。铃声或转义字符是否以某种方式破坏了 less 的初始化?知道如何修改它以不破坏less吗?我可以很容易地使用另一个编辑器,但有时我需要与其他工程师共享我的控制台进行调试,如果他们选择运行less.

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

alias postcmd 'set HIST = `history -h 1`; printf "\033]0;%s\007" "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 时的别名?

4

2 回答 2

2

根据这个链接,这个问题只存在于 Red Hat 机器

从他们的网站:

“少”命令

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

如果主目录中的 .cshrc、.profile 或任何其他 shell 启动文件打印任何文本,less 将显示该文本而不是您的文件。要摆脱这种行为,请在实际打印任何内容之前测试您是否可以写入标准输出。例如,假设您正在使用 tcsh shell,并且您已将以下语句放入 .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 样式 shell 中的等效测试:

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

常见问题解答中的常见问题解答:为什么少这样做?

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

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

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

于 2012-05-03T10:20:59.013 回答
1

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

即使使用 tcsh 6.13.00(它相当老,顺便说一句),我自己也无法重现该问题。

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

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

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

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

看看这个问题在更高版本的 tcsh 中是否仍然存在会很有趣。这很可能是一个 tcsh 错误,但我在http://bugs.gw.com/上没有看到任何相关内容。

于 2012-03-14T20:50:36.243 回答