6

まず、シェルプログラミングについて話しているので、これはプログラミングの質問です(したがって、スーパーユーザーなどには属していません)。これはほとんどゴルフの質問かもしれませんが、そもそも答えがないので、助けていただければ幸いです:-)

つまり、ストーリーは次のとおりです。非常に快適であるためless、オプションを使用してパイプを使用するのが好きです。不要なときに邪魔になりません。それともそうですか?プロンプトがすでにターミナルウィンドウの下部にある場合、このオプションは私が望むことを正確に実行します(つまり、のように動作します)。しかし、現在のプロンプトがウィンドウの上部にある場合、最初に画面をクリアするために多くの空白行を印刷し、次に画面の下部に(短い)ファイルを印刷します。そうすると、テキストが少ないことがわかります。 1つの画面よりも大きいので、終了してプロンプトが返されます。--quit-if-one-screenlesslesscatless

しかし、これらの役に立たない空白行があるため、この動作はあまり良くありません。さまざまなオプションを試したり、スクリプトやエイリアスを作成したりしましたが、考えられる最善の方法は次のとおりです(zshを使用しているため、シェルはすでにパイプなどを複製できます)。

function catless() {
 cat   \
  >>( bucket -$LINES | cat  ) \
  >>( bucket +$LINES | less )
}

bucket私が今書いた別のスクリプトはどこにありますか。それは、N行未満(-Nの場合)またはNより大きい場合(+ Nの場合)にstdinstdoutにコピーします。ここに投稿しました:http ://snipt.net/Gyom/copy-stdin-to-stdout-or-not-depending-on-length

そしてls | catlessほとんど-動作します。ただし、同期上の理由から、ここに含まれるさまざまなプロセスは端末に正しくアクセスできず、すべてがバックグラウンドで実行されます(特に、lessここで正しいものを取得することはなく、プロンプトがすぐに返されます)。しかし、たぶん私は間違った道をたどりました。

要約すると、私が欲しいのは、入力できる関数/スクリプト/何でも、の出力が1画面より短い場合と、長い場合とまったく同じようにls | catless動作することです。ls | catlsls | less

何か案は ?

4

3 に答える 3

6

フラグはあなた-Xを助けるかもしれません (less(1) から):

  -X or --no-init
         Disables sending the termcap initialization and deinitialization
         strings to the terminal.   This  is  sometimes desirable if the
         deinitialization string does something unnecessary, like
         clearing the screen.

したがって、以下はあなたが望むことをするはずです:

export LESS="-E -X"

または、 --quit-if-one-screen が好きなので、代わりに次のようにすることもできます:

export LESS="-F -X"
于 2009-10-19T20:04:31.873 に答える
1

lessオプションがあり--clear-screenます( としても利用可能です-c。 $LESS 環境変数をチェックして、そのオプションが含まれていないことを確認することをお勧めします。私のものはそうではなく、希望どおりに動作します(克服しようとしているのとは異なります)。

を使用して、アドホックベースで $LESS 変数に設定されたオプションを無効にすることができます+。例えば:

less -+c shortfile

$TERMが正しく設定されていることも確認する必要があります。

他のすべてが失敗した場合は、「入力プリプロセッサ」セクションのプリプロセッサ$LESSOPENおよびポストプロセッサ機能を調べて、別のアプローチにつながるかどうかを確認してください。$LESSCLOSEman less

于 2009-10-14T15:57:44.477 に答える
1

レスバージョン 406のニュースで、「最初のページで画面の一番下に移動しないでください。」とあります。どのバージョンがありますか? 私のシステムのバージョンは 382 で、印刷する前に画面の一番下に移動します (1 画面分しかなく、使用すると空白行が発生します-F)。

バージョン 436 をインストールしたところ、指定されたときに必要なことが実行されるようです-FX(LESS実行するだけでそれらの設定を使用できるようにするには、他の設定と一緒に env var に入れてくださいless)。

新しいバージョンを入手できない場合は、代わりにこれを試してみてください。

function catless() {
    local line buffer='' num=0 limit=$LINES
    while IFS='' read -r line; do
        buffer="$buffer$line"$'\n'
        line=''
        num=$(( num+1 ))
        [[ $num -ge $limit ]] && break
    done
    if [[ $num -ge $limit ]]; then 
        { printf %s "$buffer$line"; cat } | less
    else
        printf %s "$buffer$line"
    fi
}

重要なのは、(潜在的に) 起動する前に、ファイルに画面よりも多くの行があるかどうかをシェルが認識しなければならないことlessです (最初に使用した multi-io テクニックはバックグラウンドでしか実行できません)。シェル内readが十分に堅牢でない場合は、コードを少し修正して置き換えることができます。

function cat_up_to_N_lines_and_exit_success_if_more() {
    # replace this with some other implmentation
    # if read -r is not robust enough
    local line buffer='' num=0 limit="$1"
    while IFS='' read -r line; do
        buffer="$buffer$line"$'\n'
        line=''
        num=$(( num+1 ))
        [[ $num -ge $limit ]] && break
    done
    printf %s "$buffer$line"
    [[ $num -ge $limit ]]
}
function catless() {
    local limit=$LINES buffer=''
    # capture first $limit lines
    # the \0 business is to guard the trailing newline
    buffer=${"$(
    cat_up_to_N_lines_and_exit_success_if_more $limit
    ec=$?
    printf '\0'
    exit $ec)"%$'\0'}
    use_pager=$?
    if [[ $use_pager -eq 0 ]]; then
        { printf '%s' "$buffer"; cat } | less
    else
        printf '%s' "$buffer"
    fi
}
于 2009-10-31T17:13:29.273 に答える