4

最後に実行されたコマンドの名前とディレクトリで「postcmd」のタイトルバーを更新するようにtcsh xtermをセットアップしました。

これは私が持っていたものと似ています(再現するための最小限の例):

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

(このエイリアスは私の .cshrc ファイルにあることに注意してください。これをコマンド ラインに入力すると、100% 正しく動作します)

lessこれにより、実行するすべてのコマンドの後に xterm タイトルバーが正常に更新され、「hello_world」と表示されます。ただし、 When I runを除き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 ";'

=====EDIT===== いくつかの追加情報:

> 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 からエイリアスのコメントを外し、コマンド ラインにエイリアスを入力するだけで、less で適切に動作します。

また、エイリアスを .cshrc に入れた後、エイリアスを解除すると、エイリアスを解除した後でも壊れにくくなります。問題はエイリアスの存在ではなく、端末の作成時に .cshrc が実行されている間にエイリアスが作成されたことが原因であると思われますか?

4

2 に答える 2

2

このリンクによると、問題は Red Hat マシンのみに存在します。

彼らのサイトから:

「少ない」コマンド

less コマンドを使用しようとすると、ファイルの内容が表示される代わりに、通常はログインしたときにのみ表示されるメッセージが表示されます。これを修正するにはどうすればよいですか?

ホーム ディレクトリにある .cshrc、.profile、またはその他のシェル起動ファイルがテキストを出力する場合、less はファイルの代わりにそのテキストを表示します。この動作を取り除くには、実際に何かを印刷する前に、標準出力に書き込めるかどうかをテストしてください。たとえば、tcsh シェルを使用していて、.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

FAQ 内の FAQ: なぜ less はこれを行うのですか?

RedHat Linux では、less には、プレーン テキストに加えて他の種類のファイルを表示する機能があります。たとえば、次のように入力します。

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

バイナリ ガベージではなく、gcc-2.95.2.tar.gz に圧縮ファイルのリストが表示されます。ただし、この機能を有効にするには、サブシェルを呼び出す必要が少なくなります。そのサブシェルが標準出力に何かを書き込むと、ファイルの代わりにその出力が表示されます。

于 2012-05-03T10:20:59.013 に答える
1

コメントでの議論に基づいて、問題の原因はわかりませんが、回避策を考え出しました。

tcsh 6.13.00 (これはかなり古いですが、BTW) を使用しても、自分で問題を再現することはできません。

.loginしかし、 から、または をソースとするファイルからエイリアスを作成する.loginと、問題が回避されるようです。

私自身の実験では、タイトル バーを高解像度のタイムスタンプpostcmdで更新するコマンドのエイリアスを作成しました。xtermmy で定義されたエイリアスを使用する.cshrcと、シェルが起動するとタイトル バーが急速に更新postcmdされ、最初の対話型プロンプトが表示される前に、init スクリプトが実行されている間でも が実行されていることが示されます。(ログ ファイルに情報を追加する何かにエイリアスpostcmdを設定すると、これを追跡するのに役立ちます。)

は の後.loginに供給されるため、エイリアス定義を に移動すると、エイリアスが有効な状態で実行されるコマンドが少なくなります。とにかく、それは悪い考えではありません。ログインシェル以外ではおそらくエイリアスは必要ありません。 .cshrc.login

私の推測では、スタートアップ スクリプトの 1 つに、postcmd端末の設定を台無しにする方法でエイリアスと対話するものがあると思われます。興味がある場合は、エイリアス定義を のさまざまな場所に配置して.cshrc、どのコマンドが問題を引き起こしているかを確認できます。(分割統治アプローチとは、膨大な数の試行を実行する必要がないことを意味します。)

問題が tcsh の新しいバージョンにまだ存在するかどうかを確認することは興味深いでしょう。これは tcsh のバグである可能性がありますが、 http://bugs.gw.com/に関連するものは何もありません。

于 2012-03-14T20:50:36.243 に答える