在我们的大学里,我们有一个脚本来在linux下设置工作环境。由于我很懒,我决定通过添加source /setup/script
到 来将此过程添加到 shell 初始化中.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
答案1
我认为您的问题已在此 FAQ 页面上针对 less 命令得到解决(请参阅部分“如果我的 .cshrc、.profile 或 ENV 文件生成输出,为什么会出现问题?”):
如果您使用 LESSOPEN 功能,让 shell 生成输出可能会导致其他问题。由于 less 使用 shell 来调用 LESSOPEN 过滤器,因此 shell 的输出将出现在过滤器程序输出的开头,使其看起来像是文件的一部分。
答案2
我同意@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
文件。这对你来说可能重要也可能不重要。