When looking at the content of files, I'd like to automatically cat short files but less those that exceed the screen size. I could use something with wc -l, but is there a better way that maybe also considers the window size / current amount of lines available?
Asked
Active
Viewed 1,842 times
12
rahmu
- 19,673
- 28
- 87
- 128
Tobias Kienzler
- 9,184
- 13
- 65
- 106
-
1While many tools do this, note that it breaks expectability. I.e. the user cannot known in advance what will happen. I find this annoying for instance in `git log` which does this exact thing. You never know in advance what you're going to get (do you have to hit `q`?). – bitmask Jun 22 '12 at 19:47
-
4NOTE: In general you should avoid using `cat` to view files. Typically you should only use `cat` to send the contents of a file to stdout so it can be piped to another process. The reason to avoid using `cat` for viewing is that it sends the raw bytes to the terminal, which can cause unexpected terminal commands to be executed (e.g., some users have gotten stuck when a file happened to contain the right bytes to disable the terminal keyboard). You should usually use a pager like `less` or an editor, which will format special characters for display so they aren't interpreted by the terminal. – Chris Page Jun 25 '12 at 06:25
-
2If you're going to use cat to view file contents directly in the terminal, at least use `cat -v` so it escapes special characters. – Chris Page Jun 25 '12 at 06:26
-
@bitmask good point, that's why I asked [Is split-screen `cat`ing possible?](http://unix.stackexchange.com/questions/41370/is-split-screen-cating-possible) which might be a better solution – Tobias Kienzler Jun 25 '12 at 08:15
-
@ChrisPage My keyboard wasn't killed, but I think I managed to screw up the codepage once... Thanks for pointing `cat -v` out – Tobias Kienzler Jun 25 '12 at 08:16
2 Answers
20
Maybe 'less -F file_to_read' is the option : it exits less if the window is sufficient to display all the file, and wait on the pager if it is not the case
Dom
- 918
- 5
- 13
-
sounds good, but that does not output anything in that case, and the exit codes is the same in both cases – Tobias Kienzler Jun 22 '12 at 09:53
-
I just try 'less -F /etc/passwd' and it display the file correctely (with or without pager). You are right, the return code is 0 in both cases. – Dom Jun 22 '12 at 10:44
-
12That command works as requested, but with a minor glitch: it clears the screen after displaying the file. Adding the `-X` option will stop the clearing, so short files will be displayed like `cat` does. Unfortunately with `-X` the screen will not be cleared neither after displaying long, scrolled files. – manatwork Jun 22 '12 at 11:12
-
1@manatwork that's great, thanks. Not clearing the screen is actually ok, since that's what would (not) happen if `cat` were called as well – Tobias Kienzler Jun 22 '12 at 11:50
9
To give you the formula which involves the wc-based check:
(($(wc -l<input_file)<=$(tput lines))) && echo 'will fit' || echo 'not enough'
There is a $LINES shell variable which can also be used:
(($(wc -l<input_file)<=LINES)) && echo 'will fit' || echo 'not enough'
But $LINES is updated only when at the command prompt. To understand what I mean, run this and resize the terminal window during the sleep:
( sleep 3; echo $LINES; tput lines )
manatwork
- 30,549
- 7
- 101
- 91
-
Thanks, this has the advantage that it can be tuned to use `less` already if e.g. 2/3 of the screen were used by `cat`. – Tobias Kienzler Jun 22 '12 at 11:57