less는 .cshrc에서 스크립트를 가져온 후 예상 출력을 표시하지 않습니다.

less는 .cshrc에서 스크립트를 가져온 후 예상 출력을 표시하지 않습니다.

우리 대학에는 Linux에서 작업 환경을 설정하는 스크립트가 있습니다. 제가 게을러서 source /setup/script이 과정을 셸 초기화에 추가하기 로 했습니다 .cshrc. 하지만 이제 그렇게 했으니 더 적게 사용할 수는 없습니다. less somefile해당 스크립트의 출력을 실행하면 덜 표시됩니다.대신에콘텐츠 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)

고쳐 쓰다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

답변1

귀하의 문제는 less 명령에 대한 FAQ 페이지에서 해결된 것 같습니다(섹션 참조).".cshrc, .profile 또는 ENV 파일이 출력을 생성하는 경우 왜 문제가 발생합니까?"):

LESSOPEN 함수를 사용하는 경우 쉘이 출력을 생성하도록 하면 다른 문제가 발생할 수 있습니다. less는 LESSOPEN 필터를 호출하기 위해 쉘을 사용하기 때문에 쉘의 출력은 필터 프로그램의 출력 시작 부분에 나타나 파일의 일부인 것처럼 보이게 합니다.

답변2

왜 이런 일이 발생하는지에 대해 @Tyler의 의견에 동의합니다.

다른 두 가지 질문에 답하려면:

  1. 잘못되었습니까? 더 좋은 방법이 있습니까? 소스 initscript를 .cshrc에 추가하십시오.
  2. 계속해서 적게 사용하려면 어떻게 해야 합니까(출력 리디렉션 없음, 스크립트는 유용하다고 생각되는 일부 사용 정보를 에코함)?

당신은 아마도 source /setup/script당신의 로 이동하고 싶을 것입니다 .login.시작 및 종료부분 man tcsh:

비로그인 쉘은 시작 시 /etc/csh.cshrc 및 ~/.tcshrc 또는 ~/.cshrc만 읽습니다.

...

stty(1) 및 tset(1)과 같은 명령은 로그인당 한 번만 실행하면 되며 일반적으로 ~/.login 파일에 배치됩니다.

less쉘이 호출되지만 비로그인 쉘이므로 출력이 생성되지 않습니다 .login.

여기서 주의할 점은 이와 같은 것이 파일 screen을 실행하지 않는다는 것입니다 ~/.login. 이것은 당신에게 중요할 수도 있고 중요하지 않을 수도 있습니다.

관련 정보