Csh

在 .cshrc 中獲取腳本後,less 未顯示預期輸出

  • October 20, 2017

在我們大學,我們有一個腳本來設置 linux 下的工作環境。由於我很懶,我決定將此過程添加到 shell 初始化中,方法是添加source /setup/script.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

我認為您的問題已在此 FAQ 頁面上針對 less 命令得到解決(請參閱“如果我的 .cshrc、.profile 或 ENV 文件產生輸出,為什麼會有問題?”部分):

如果您使用 LESSOPEN 功能,讓您的 shell 產生輸出可能會導致其他問題。由於 less 使用 shell 呼叫 LESSOPEN 過濾器,因此 shell 的輸出將出現在過濾器程序輸出的開頭,使其看起來像是文件的一部分。

我同意@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文件。這對你來說可能重要也可能不重要。

引用自:https://unix.stackexchange.com/questions/70694