小さなファイルの場合は、画面にテキストを保持するには「less」を使用してください。

小さなファイルの場合は、画面にテキストを保持するには「less」を使用してください。

私はずっと前に、いくつかの同僚のシステムで「もっと」を模倣するためにlessコマンドをカスタマイズするのを見たことがあると確信しています。私が望むもの:

  • ファイルが短い場合(1画面未満)、catのように動作する必要があります。ファイルの内容を表示して終了します。

  • ファイルが1つの画面より長い場合は、通常どおり実行され、ユーザー入力を待ち、終了時に画面を消去し、前のコマンドを画面に残す必要があります。

-FXを減らして実験してみましたが、ファイルが大きいと画面に多くの内容が残ります。

答え1

私が正しく理解したら、大容量ファイルの代替画面切り替え動作を維持し、単一の画面に収まり、スクロールを必要としない小さなファイルに対してのみ-Xスイッチをオンにしたいと思います。

これは、ドキュメントで引用されたバージョン530のデフォルト動作ですlessNEWSソースコード:

マイナーバージョン487と530の間の主な変更点

  • -F使用とファイルが1画面に収まる場合は、端末初期化シーケンスを出力しないでください。

残念ながら、2019年現在の一部のディストリビューション(Debian 10など)はまだ古いバージョンを使用しているため、以前のバージョンlessから切り替えたくない場合源泉、唯一の解決策はラッパーを使用することです。

以下はそのようなラッパーの例です。既知の制限事項は次のとおりです。ㅏ):n:p次/前のファイル)コマンドは機能しませんless。コマンドラインのすべてのファイルが1つのストリームにリンクされています。雨)/usr/bin/awk実際にはgawk(GNU Awk)またはThomas Dickey以外の入力のNULLバイトを処理できません。

#! /usr/bin/awk -f
BEGIN { "tput lines" | getline max; max -= 2 }
{ l[NR]=$0 }
NR>=max {
        for(i = 1; i <= NR; i++) print l[i] | "less";
        while(getline > 0) print | "less";
}
END { if (NR < max) for(i = 1; i <= NR; i++) print l[i] | "less -FX" }

答え2

この問題を解決する簡単な方法はありません。

less元の画面をきれいに保つために、代替画面を使用または使用しないことがあります-X

lessページ全体を読んだ後、画面を再度インポートして代替画面を使用し始めることはできません。

less正しいモードで起動してデータを送信する前に、少なくとも1ページまたはeofが読み取られるまで待つ必要があります。それは次のとおりです。

page_stdin() {
  awk -v l="${LINES:=$(tput lines)}" '
    cmd {print | cmd; next}
    {lines = lines $0 ORS}
    NR == l {cmd = "less"; printf "%s", lines | cmd}
    END {if (!cmd) printf "%s", lines | "less -FX"}'
}
mypager() {
  if [ "$#" -eq 0 ]; then
    page_stdin
  else
    for file do page_stdin < "$file"; done
  fi
}

(GNUを使用すると、最初に改行がない場合は末尾の改行を追加しないことでawk置き換えることができます)。ORSRT

cmd | mypagerただし、これはコンテンツページ全体があるか、出力が完了するまでパイプされたコマンドの出力が表示されないことを意味します。 (たとえばとseq 200 | pv -qL40 | mypager比較してみてくださいseq 200 | pv -qL40 | less)。

それはあなたがそのようなものを使用しないと仮定しLESS=-s、あなたがそれを持っていない場合は、画面より大きな行にだまされることに注意してくださいLESS=-S

答え3

これを端末に貼り付ける(またはbashrcに入れてください):

less_cat(){
     [ "$(wc -l <"$1")" -ge "$LINES" ] && less "$1" || less -FX "$1"
}

これで、以下を実行できます。

less_cat /etc/fstab
less_cat /var/log/messages 

それはあなたが望むものを正確にします。

メモ:このソリューションはBASH / ZSHと互換性があります(説明を参照)。

頑張ってください!

関連情報