首先,我要指出,这是一个的编程的问题(因而对超级用户的等人不属于。的),因为我说的shell编程。这几乎可以成为一个高尔夫的问题,但我不知道答案,首先,所以任何帮助,将不胜感激: - )

所以,这个故事是:我喜欢管的东西与less选项--quit-if-one-screen,因为它是很舒服:lessdoes我的方式没有得到必要的时候。确实如此吗?当我的提示已经是我的终端窗口的底部,这个选项不正是我想要什么(即less行为像cat)。但是,当我的当前提示是在窗口的顶部,less第一打印大量的空行的明确屏幕,然后打印出我的(短)文件在屏幕的底部,而只然后它意识到有文字超过一个屏幕少,所以它离开,我让我的提示了。

但这种行为是不是很大,因为所有那些无用的空行。我尝试了不同的选项,或写脚本和别名,我可以想出将这个最好的(我使用的zsh,所以外壳已经能够复制管道等的):

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

其中bucket是另一个脚本我只写,其拷贝标准输入标准输出如果它小于N线(与-N)或多于N(用+ N)。 我张贴在这里:的http:// snipt达网络/ Gyom /复制标准输入到标准输出或 - 未根据上长度

ls | catless几乎作品。但是,对于同步的原因,这里所涉及的不同进程不正确地获取访问的终端,一切都在后台执行(特别是,我从来没有在这里得到一个正确的less,并及时回来太快)。但是,也许我走错了路。

因此,要总结,我想是这样的功能/脚本/无论我可以输入ls | catless和它的行为的究竟的像ls | catls的输出短于一个屏幕,而像ls | less时长。

任何想法?

有帮助吗?

解决方案

在更少的版本406 中消息,我看“不要T移至屏幕第一页上的底部。”您有哪些版本?我的系统版本382和它印刷(导致空白行如果只有一分屏和-F使用)之前移动到屏幕的底部。

我刚安装的版本436,它似乎做你想要给出-FX时(将其与其他首选项,让任何运行一个命令LESS使用这些首选项的less的环境变量)的东西。

如果你不能得到新的版本,你可以试试这个:

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-一个屏幕,你可以改为:

export LESS="-F -X"

less--clear-screen选项(也可作为-c,你可能要检查你的$ LESS环境变量,以确保它的提供这样的选择。煤矿没有和它完全相同的行为,你旺旺(不是你努力克服)。

您可以禁用$ LESS变量设置的特设的使用+基础上选择。例如:

less -+c shortfile

您也应该确保$TERM设置是否正确。

如果一切都失败了,看看$LESSOPEN预处理器和$LESSCLOSE man less的“INPUT PREPROCESSOR”一节中后处理器的功能,看看是否能导致你的另一种方法。

scroll top