Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to automatically pipe to less if the result is more than a page on my shell?

Tags:

linux

bash

shell

Mostly, I will not use | less for each and every command from the shell.

Pipe to less is used only when I actually run the command without is and find out that it does not fit on the page. That costs me two runs of the same shell command.

Is there a way so that every time a command result is more than a display page, it automatically gets piped to less?

like image 257
Lazer Avatar asked Nov 13 '10 19:11

Lazer


People also ask

How do I search in less mode?

Move up for a specific number of lines, by typing the number followed by the b key. If you want to search for a pattern, type forward slash ( / ) followed by the pattern you want to search. Once you hit Enter less will search forward for matches.

How return less command in Linux?

Move to the next file by pressing the : key followed by n . Return to the previous file by pressing : and p .

What is the use of less command in Linux?

Less command is a Linux utility that can be used to read the contents of a text file one page(one screen) at a time. It has faster access because if file is large it doesn't access the complete file, but accesses it page by page.


3 Answers

Pipe it to less -F aka --quit-if-one-screen:

Causes less to automatically exit if the entire file can be dis- played on the first screen.

like image 129
Ben Jackson Avatar answered Sep 18 '22 22:09

Ben Jackson


The most significant problem with trying to do that is how to get it to turn off when running programs that need a tty.

What I would recommend is that, for programs and utilities you frequently use, create shell functions that wrap them and pipe to less -F. In some cases, you can name the function the same as the program and it will take precedence, but can be overridden.

Here is an example wrapper function which would need testing and perhaps some additional code to handle edge cases, etc.

#!/bin/bash
foo () {
    if [[ -p /dev/stdout ]]  # you don't want to pipe to less if you're piping to something else
    then
        command foo "$@" | less -F
    else
        command foo "$@"
    fi
}

If you use the same name as I have in the example, it could break things that expect different behavior. To override the function to run the underlying program directly precede it with command:

command foo

will run foo without using the function of the same name.

like image 24
Dennis Williamson Avatar answered Sep 22 '22 22:09

Dennis Williamson


You could always pipe to less -E (this will cause less to automatically quit at the end of the file). For commands with short output it would do what you want. I don't think you can automatically pipe to less when there is a lot of output.

like image 44
GWW Avatar answered Sep 18 '22 22:09

GWW