우리 대학에는 Linux에서 작업 환경을 설정하는 스크립트가 있습니다. 제가 게을러서 source /setup/script
이 과정을 셸 초기화에 추가하기 로 했습니다 .cshrc
. 하지만 이제 그렇게 했으니 더 적게 사용할 수는 없습니다. less somefile
해당 스크립트의 출력을 실행하면 덜 표시됩니다.대신에콘텐츠 somefile
.
나는 다음을 사용하여 이 문제를 해결했습니다.source /setup/script > /dev/null
질문은 다음과 같습니다.
- 잘못됐나요/더 좋은 방법이 있나요
source initscript
?.cshrc
- 계속 사용하려면 어떻게 해야 합니까
less
(출력 리디렉션 없이 스크립트는 유용하다고 생각되는 일부 사용 정보를 다시 표시합니다)? - 왜 이런 일이 발생합니까?
편집하다:알겠습니다. 스크립트를 추가하는 것이 불편하므로 다음은 나에게 영향을 덜 미치는 최소한의 예입니다.
.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의 의견에 동의합니다.
다른 두 가지 질문에 답하려면:
- 잘못되었습니까? 더 좋은 방법이 있습니까? 소스 initscript를 .cshrc에 추가하십시오.
- 계속해서 적게 사용하려면 어떻게 해야 합니까(출력 리디렉션 없음, 스크립트는 유용하다고 생각되는 일부 사용 정보를 에코함)?
당신은 아마도 source /setup/script
당신의 로 이동하고 싶을 것입니다 .login
.시작 및 종료부분 man tcsh
:
비로그인 쉘은 시작 시 /etc/csh.cshrc 및 ~/.tcshrc 또는 ~/.cshrc만 읽습니다.
...
stty(1) 및 tset(1)과 같은 명령은 로그인당 한 번만 실행하면 되며 일반적으로 ~/.login 파일에 배치됩니다.
less
쉘이 호출되지만 비로그인 쉘이므로 출력이 생성되지 않습니다 .login
.
여기서 주의할 점은 이와 같은 것이 파일 screen
을 실행하지 않는다는 것입니다 ~/.login
. 이것은 당신에게 중요할 수도 있고 중요하지 않을 수도 있습니다.