質問
まず、これは私がシェルプログラミングを話しているので、の質問(したがって、スーパーユーザのの他属していません。アル。の)プログラミングのであることを私の状態をみましょう。これはほとんどのゴルフの質問かもしれないが、私はそもそも答えを持っていないので、任意の助けをいただければ幸いです: - )
だから、ストーリーがある:それは非常に快適ですので、私はless
オプション付き--quit-if-one-screen
にパイプのものに好き:不要な場合less
doesが私の方法で取得していません。それともそれはありませんか?私のプロンプトが私のターミナルウィンドウの一番下にすでにある場合は、このオプションは(すなわちless
振る舞うcat
のように)私が欲しいまさにありません。しかし、私の現在のプロンプトがウィンドウの上部にある、less
は、最初のの明確なの画面に空白行をたくさん印刷したときに、それからだけで画面の一番下に私の(短い)ファイルを出力し、それが終了し、私は私のプロンプトを取り戻すように、それは、一つの画面よりも小さいテキストがあることを実現します。
しかし、この現象は、これらすべての無用の空白行の、素晴らしいではありません。私は、さまざまなオプションを試してみました、またはスクリプトやエイリアスを書き、私が思い付くことができる最高のは、この(私はzshのを使用していますので、シェルが既にパイプを複製することが可能であり、その上)になります:
function catless() {
cat \
>>( bucket -$LINES | cat ) \
>>( bucket +$LINES | less )
}
bucket
はそれが少ない(-N付き)Nラインより以上N以下(+とであれば、私はちょうどそのコピー STDIN から STDOUT の、書いた別のスクリプトです。N)。 私はそれをここに投稿:ます。http:// snipt .NET / Gyom /コピーSTDINツーSTDOUT-OR-依存しないオン長の
そしてls | catless
ほとんど-作品。しかし、同期の理由のために、異なるプロセスがここに関与(特に、私はここに正しいless
を取得することはありません、そしてプロンプトがあまりにも早く戻ってくる)、バックグラウンドで正しく端末にアクセスし、すべての実行を得ることはありません。しかし、多分私は間違ったパスを取っています。
だから、私が欲しいもの、要約することは、私はls | catless
を入力することができ、そのような機能/スクリプト/何でもそれで、ls | cat
の出力が1つの画面よりも短くなっている、などが挙げられるとき、それはの正確のls
のように振る舞いますls | less
とき長います。
任意のアイデア?
解決
私だけのインストールバージョン436は、と-FX
(何がちょうどLESS
を実行することにより、これらの環境設定を使用できるように、あなたの他のprefsとless
のENV varにそれを置く)。
、あなたの代わりにこれを試してみてください。
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
前画面よりもファイル内の多くの行が(あなたが最初に使用マルチ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
}
他のヒント
は-X
フラグが(以下(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-1-画面、あなたが代わりに可能性のような:
export LESS="-F -X"
less
は--clear-screen
としても利用可能-c
オプションを(持っている。あなたが確認するために$ LESS環境変数をチェックしたい場合がありますことないのありませんのそのオプションが含まれています。鉱山にはありません、それはあなたのように正確に動作しますたい(あなたが克服しようとしているではないとして)。
あなたは無効なオプションが+
を使用して、のアドホックの基準で$ LESS変数で設定することができます。たとえばます:
less -+c shortfile
また$TERM
が正しく設定されていることを確認する必要があります。
他のすべてが失敗した場合は、$LESSOPEN
プリプロセッサと$LESSCLOSE
ポストプロセッサを見ては、別のアプローチにそれがリードあなたのかどうかを確認するためにman less
の「INPUTプリプロセッサ」セクションに備えています。