在 .cshrc 中获取脚本后,less 不显示预期输出

在 .cshrc 中获取脚本后,less 不显示预期输出

在我们的大学里,我们有一个脚本来在linux下设置工作环境。由于我很懒,我决定通过添加source /setup/script到 来将此过程添加到 shell 初始化中.cshrc。但既然我已经这么做了,我就不能再少用了。当我运行时less somefile,所述脚本的输出显示为 less反而的内容somefile

我设法通过使用解决了这个问题source /setup/script > /dev/null

所以问题是:

  1. 是否错误/是否有更好的方法,然后添加source initscript.cshrc
  2. 我如何继续使用less(没有输出重定向,脚本会回显一些我认为有用的使用信息)?
  3. 为什么会发生这种情况?

编辑:好吧,因为添加脚本让我感觉不舒服,这里是一个对我来说影响较小的最小示例:

.cshrc:

source ~/test

~/test:

echo "test"

如果我现在这样做,less test我会得到test而不是echo "test",顺便说一句,我检查过,其他文件的输出是相同的。输出位于 less 环境中(按下q可返回控制台)

更新:还有一个额外烦人的事情: less imaginaryPathToNonexistingFile- 有效,相同的输出。 less 有某种内存:每次我更改文件时,我打开的显示test都会在屏幕上向下一行,直到它位于filename(END)控制台底部的正上方

更新:我发现有一个环境变量叫LESSOPENset to |/usr/bin/lesspipe.sh %s(thx vonbrand)

#!/bin/sh -
#
# To use this filter with less, define LESSOPEN:
# export LESSOPEN="|/usr/bin/lesspipe.sh %s"

lesspipe() {
  case "$1" in
  *.[1-9n]|*.man|*.[1-9n].bz2|*.man.bz2|*.[1-9].gz|*.[1-9]x.gz|*.[1-9].man.gz)
    case "$1" in
        *.gz)   DECOMPRESSOR="gunzip -c" ;;
        *.bz2)  DECOMPRESSOR="bunzip2 -c" ;;
        *)  DECOMPRESSOR="cat" ;;
    esac
    if $DECOMPRESSOR -- "$1" | file - | grep -q troff; then
        if echo "$1" | grep -q ^/; then #absolute path
            man -- "$1" | cat -s
        else
            man -- "./$1" | cat -s
        fi
    else
        $DECOMPRESSOR -- "$1"
    fi ;;
  *.tar) tar tvvf "$1" ;;
  *.tgz|*.tar.gz|*.tar.[zZ]) tar tzvvf "$1" ;;
  *.tar.bz2|*.tbz2) bzip2 -dc -- "$1" | tar tvvf - ;;
  *.[zZ]|*.gz) gzip -dc -- "$1" ;;
  *.bz2) bzip2 -dc -- "$1" ;;
  *.zip) zipinfo -- "$1" ;;
  *.rpm) rpm -qpivl --changelog -- "$1" ;;
  *.cpi|*.cpio) cpio -itv < "$1" ;;
  *.gif|*.jpeg|*.jpg|*.pcd|*.png|*.tga|*.tiff|*.tif)
   if [ -x "`which identify`" ]; then
     identify "$1"
   else
     echo "No identify available"
     echo "Install ImageMagick to browse images"
   fi ;;
  *)
    case "$1" in
        *.gz)   DECOMPRESSOR="gunzip -c" ;;
        *.bz2)  DECOMPRESSOR="bunzip2 -c" ;;
    esac
    if [ ! -z $DECOMPRESSOR ] ; then
        $DECOMPRESSOR -- "$1" ;
    fi
  esac
}

if [ -d "$1" ] ; then
    /bin/ls -alF -- "$1"
else
    lesspipe "$1" 2> /dev/null
fi

答案1

我认为您的问题已在此 FAQ 页面上针对 less 命令得到解决(请参阅部分“如果我的 .cshrc、.profile 或 ENV 文件生成输出,为什么会出现问题?”):

如果您使用 LESSOPEN 功能,让 shell 生成输出可能会导致其他问题。由于 less 使用 shell 来调用 LESSOPEN 过滤器,因此 shell 的输出将出现在过滤器程序输出的开头,使其看起来像是文件的一部分。

答案2

我同意@Tyler 的观点,为什么会发生这种情况。

回答你的另外两个问题:

  1. 是否错误/是否有更好的方法,然后将源 initscript 添加到 .cshrc
  2. 我如何继续使用 less (没有输出重定向,脚本会回显一些我认为有用的使用信息)?

您很可能希望将 移动source /setup/script到您的.login,按照启动和关闭部分man tcsh

非登录 shell 在启动时仅读取 /etc/csh.cshrc 和 ~/.tcshrc 或 ~/.cshrc。

...

像 stty(1) 和 tset(1) 这样的命令每次登录只需运行一次,通常放在 ~/.login 文件中。

less调用 shell,但它是非登录 shell,因此不会产生任何输出.login

这里需要注意的是,类似的东西screen不会执行该~/.login文件。这对你来说可能重要也可能不重要。

相关内容