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に、私が確認したところによると、他のファイルの出力は同じです。出力はless環境にあります(コンソールに戻るにはタップします)。testecho "test"q

修正する:そしてもう一つの迷惑な点は: less imaginaryPathToNonexistingFile- 動作しますが、同じ結果が出ます。 lessには一種のメモリがあります。ファイルを変更するたびに、私が開くディスプレイは、コンソールの下部のすぐ上にtest来るまで画面上の1行下に移動します。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フィルタを呼び出すためにシェルを使用するため、シェルの出力はフィルタプログラムの出力の先頭に表示され、ファイルの一部であるように見えます。

おすすめ記事