在 .cshrc 中獲取腳本後,less 未顯示預期輸出
在我們大學,我們有一個腳本來設置 linux 下的工作環境。由於我很懶,我決定將此過程添加到 shell 初始化中,方法是添加
source /setup/script
到.cshrc
. 但是,既然我這樣做了,我就不能再少用了。當我執行時less somefile
,該腳本的輸出顯示為 less而不是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
我認為您的問題已在此 FAQ 頁面上針對 less 命令得到解決(請參閱“如果我的 .cshrc、.profile 或 ENV 文件產生輸出,為什麼會有問題?”部分):
如果您使用 LESSOPEN 功能,讓您的 shell 產生輸出可能會導致其他問題。由於 less 使用 shell 呼叫 LESSOPEN 過濾器,因此 shell 的輸出將出現在過濾器程序輸出的開頭,使其看起來像是文件的一部分。
我同意@Tyler 關於為什麼會發生這種情況的觀點。
要回答您的其他兩個問題:
- 是不是錯了/有沒有更好的方法,然後將源initscript添加到.cshrc
- 我怎樣才能繼續使用 less(沒有輸出重定向,腳本會回顯一些我認為有幫助的使用資訊)?
根據以下的啟動和關閉部分,您很可能希望將 移動
source /setup/script
到您的:.login``man tcsh
非登錄 shell 在啟動時只讀 /etc/csh.cshrc 和 ~/.tcshrc 或 ~/.cshrc。
…
像 stty(1) 和 tset(1) 這樣的命令,每次登錄只需要執行一次,通常放在一個人的 ~/.login 文件中。
less
呼叫 shell,但它是一個非登錄 shell,因此不會從.login
.這裡需要注意的是,類似的東西
screen
不會執行~/.login
文件。這對你來說可能重要也可能不重要。