less não mostra a saída esperada após o fornecimento de um script em .cshrc

2

Em nossa universidade, temos um script para configurar o ambiente de trabalho no linux. Como eu sou preguiçoso, decidi adicionar esse processo à inicialização do shell adicionando source /setup/script a .cshrc . No entanto, desde que eu fiz isso, eu não posso usar menos. Quando executo less somefile , a saída do dito script é exibida por menos em vez do conteúdo de somefile .

Consegui contornar o problema usando source /setup/script > /dev/null

Então as perguntas:

  1. Está errado / há uma maneira melhor de adicionar source initscript a .cshrc ?
  2. Como posso continuar usando less (sem o redirecionamento de saída, o script ecoa algumas informações de uso que considero úteis)?
  3. Por que isso está acontecendo?

edit : OK, já que me sinto desconfortável ao adicionar os scripts, aqui está um exemplo mínimo que quebra menos para mim:

.cshrc :

source ~/test

~/test :

echo "test"

Se eu fizer agora less test recebo test em vez de echo "test" , a propósito, a saída é a mesma para outros arquivos, eu verifiquei. A saída está dentro do ambiente menos (pressionando q me retorna ao console)

update : Há uma outra coisa irritante: less imaginaryPathToNonexistingFile - funciona, a mesma saída. menos tem algum tipo de memória: toda vez que eu troco o arquivo abro a tela do test é uma linha para baixo na tela, até que fique bem acima do filename(END) na parte inferior do console

update : Eu descobri que existe uma variável de ambiente chamada LESSOPEN set 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
    
por ted 31.03.2013 / 16:01

2 respostas

2

Eu acho que o seu problema é abordado nesta página de FAQ para o comando menos (consulte a seção "Por que há problemas se o meu. cshrc, .profile ou arquivos ENV produzem saída? "):

If you use the LESSOPEN feature, having your shell produce output can cause other problems. Since less uses the shell to invoke the LESSOPEN filter, the output from the shell will appear at the beginning of the output from the filter program, causing it to appear to be part of the file.

    
por 02.10.2014 / 19:18
1

Concordo com o @Tyler sobre por que isso está acontecendo.

Para responder às suas outras duas perguntas:

  1. Is it wrong/is there a better way, then adding source initscript to .cshrc
  2. How can I continue using less (without the output redirect, the script echos some ussage information I find helpfull)?

Você provavelmente deseja mover source /setup/script para seu .login , de acordo com a seção Inicialização e desligamento de man tcsh :

Non-login shells read only /etc/csh.cshrc and ~/.tcshrc or ~/.cshrc on startup.

...

Commands like stty(1) and tset(1), which need be run only once per login, usually go in one’s ~/.login file.

less chama o shell, mas é um shell não-login e, portanto, não produz saída de .login .

A ressalva aqui é que algo como screen não executará o arquivo ~/.login . Isso pode ou não ser importante para você.

    
por 20.10.2017 / 18:36

Tags