Frage

Lassen Sie mich zunächst fest, dass es sich um eine Programmierung Frage (und damit nicht gehört auf Superuser et. Al. ), weil ich Shell-Programmierung rede. Dies könnte fast eine Golf-Frage, aber ich habe nicht eine Antwort zu beginnen, so dass jede Hilfe würde geschätzt: -)

Also, die Geschichte ist: Ich mag an Rohr Sachen in less mit der --quit-if-one-screen Option, weil es sehr komfortabel ist: lessdoes nicht in mir aus dem Weg, wenn nicht erforderlich. Oder doch? Als meine Aufforderung bereits am unteren Rand meines Terminal-Fenster ist, hat diese Option genau das, was ich will (das heißt less verhält sich wie cat). Aber, wenn meine aktuelle Eingabeaufforderung am oberen Rand des Fensters ist, less Erstdrucke viel Leerzeilen klar der Bildschirm, druckt dann aus meiner (kurz) Datei am unteren Rand des Bildschirms, und nur dann erkennt er, dass es weniger Text als ein Bildschirm, so dass es austritt und ich prompt zurück.

Aber dieses Verhalten ist nicht groß, weil alle diese nutzlosen Leerzeilen. Ich habe versucht, verschiedene Optionen, oder schrieb Skripte und Aliase und das Beste, was ich tun konnte dies würde (ich bin mit zsh, so dass die Schale bereits in der Lage zu duplizieren Rohren usw.):

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

Wo bucket ist ein weiteres Skript, das ich gerade geschrieben habe, die Kopien stdin stdout , wenn es weniger als N Zeilen (mit N) oder mehr als N (mit + N). Ich gab es hier: http: // Schnipsel .net / Gyom / copy-stdin-to-stdout-oder-nicht-abhängig-on-Länge

Und ls | catless fast funktioniert. Aber für die Synchronisierung Gründe beteiligten die verschiedenen Prozesse hier nicht bekommen Zugang zu dem Terminal richtig und alles wird im Hintergrund ausgeführt (insbesondere ich nie eine richtige less hier bekommen, und die Aufforderung kommt zurück zu früh). Aber vielleicht habe ich den falschen Weg.

Also, um zusammenzufassen, was ich will, ist eine solche Funktion / script / was auch immer, dass ich ls | catless geben und es verhält sich genau wie ls | cat wenn der Ausgang des ls kürzer ist als ein Bildschirm, und wie ls | less wenn mehr.

Irgendwelche Ideen?

War es hilfreich?

Lösung

In den Nachrichten für weniger Version 406 , sehe ich „Don‘ t Umzug nach unten auf dem Bildschirm auf der ersten Seite.“. Welche Version haben Sie? Meine Systemversion ist 382 und es bewegt sich nach unten auf dem Bildschirm vor dem Drucken (was Leerzeilen, wenn es nur eine Bildschirm und -F ist verwendet wird).

Ich habe gerade installierte Version 436, und es scheint zu tun, was Sie wollen, wenn -FX gegeben (stecken es in der LESS env var mit dem anderen Prefs etwas Gebrauch zu lassen, diese Prefs von nur less ausgeführt wird).

Wenn Sie nicht die neue Version bekommen können, können Sie versuchen, diese stattdessen:

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
}

Der Schlüssel ist, dass die Schale muss wissen, wenn die mehr Zeilen in der Datei als der Bildschirm sind, bevor es (potentiell) startet less (die Multi-io Technik, die Sie zunächst nur die Dinge im Hintergrund laufen, verwendet werden). Wenn die in der Schale read für Sie nicht robust genug ist, können Sie es ersetzen durch den Code ein wenig Nacharbeit:

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
}

Andere Tipps

Die -X Flagge Sie könnte helfen (von weniger (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.

Folgendes sollte also tun, was Sie wollen:

export LESS="-E -X"

Oder, da Sie wie --quit-if-one-Bildschirm, Sie könnten statt:

export LESS="-F -X"

less hat eine --clear-screen Option (auch als -c. Vielleicht möchten Sie Ihre $ LESS Umgebungsvariable überprüfen, um sicherzustellen, dass es funktioniert nicht enthalten diese Option. Grube nicht und es verhält sich genau so, wie Sie wollen (nicht wie Sie versuchen zu überwinden).

Sie können deaktivieren Optionen, die in dem $ weniger variabel auf eine ad hoc Basis von + verwenden. Zum Beispiel:

less -+c shortfile

Sie sollten auch sicherstellen, dass $TERM richtig eingestellt ist.

Wenn alle Stricke reißen, Blick auf die $LESSOPEN Pre-Prozessor und $LESSCLOSE Postprozessor verfügt in der „INPUT PREPROCESSOR“ Abschnitt man less zu sehen, ob das führt Sie zu einem anderen Ansatz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top