Vì ít hơn 530 (phát hành vào tháng 12 năm 2017), less --quit-if-one-screen
không chuyển sang màn hình thay thế nếu nó đọc ít hơn một màn hình. Vì vậy, bạn sẽ không gặp phải vấn đề này nếu phiên bản ít hơn của bạn đủ gần đây.
Trong các phiên bản trước, ít phải quyết định có sử dụng màn hình thay thế khi bắt đầu hay không. Bạn không thể trì hoãn lựa chọn đó khi nó chấm dứt.
Bạn có thể gọi ít hơn, cho phép nó sử dụng màn hình thay thế và đưa nội dung lên màn hình chính nếu ít kết thúc tự động. Tuy nhiên tôi không biết cách phát hiện chấm dứt tự động.
Mặt khác, không khó để gọi cat cho đầu vào ngắn và ít hơn cho đầu vào lớn hơn, thậm chí bảo toàn bộ đệm để bạn không phải đợi toàn bộ đầu vào bắt đầu nhìn thấy ít hơn (bộ đệm có thể lớn hơn một chút - bạn sẽ không thấy bất cứ điều gì cho đến khi bạn có ít nhất một màn hình dữ liệu - nhưng không nhiều hơn nữa).
#!/bin/sh
n=3 # number of screen lines that should remain visible in addition to the content
lines=
newline='
'
case $LINES in
''|*[!0-9]*) exec less;;
esac
while [ $n -lt $LINES ] && IFS= read -r line; do
lines="$lines$newline$line"
done
if [ $n -eq $LINES ]; then
{ printf %s "$lines"; exec cat; } | exec less
else
printf %s "$lines"
fi
Bạn có thể thích nhìn thấy các dòng trên màn hình chính khi chúng đến và chuyển sang màn hình thay thế nếu các dòng sẽ gây ra cuộn.
#!/bin/sh
n=3 # number of screen lines that should remain visible in addition to the content
beginning=
newline='
'
# If we can't determine the terminal height, execute less directly
[ -n "$LINES" ] || LINES=$(tput lines) 2>/dev/null
case $LINES in
''|*[!0-9]*) exec less "$@";;
esac
# Read and display enough lines to fill most of the terminal
while [ $n -lt $LINES ] && IFS= read -r line; do
beginning="$beginning$newline$line"
printf '%s\n' -- "$line"
n=$((n + 1))
done
# If the input is longer, run the pager
if [ $n -eq $LINES ]; then
{ printf %s "$beginning"; exec cat; } | exec less "$@"
fi