为什么 PAGER、EDITOR、VISUAL 为空?

为什么 PAGER、EDITOR、VISUAL 为空?

当我尝试使用这些环境变量时,我得到一个空字符串:

$ $PAGER some_file;
bash: some_file: command not found
$

我测试了一些东西:

$ echo $PAGER;

$ man man;     ## Here it's using less(1)
$ export PAGER;
$ man man;     ## Still using less(1)
$ PAGER='';
$ echo $PAGER;

$ man man;     ## Here it uses cat(1)
$ export PAGER;
$ man man;     ## Here it uses cat(1), too
$ unset PAGER;
$ man man;     ## Here it uses less(1) again

为什么?我该如何使用这些变量?

env |grep PAGER什么也没显示。

我的系统是Debian 11(测试)


编辑:

我的目的是编写一个依赖寻呼机的脚本。

我会使用less,但我不能保证它会存在,所以我想使用$PAGER.

这些变量不是应该始终存在以便我可以依赖它们吗?

答案1

man依靠PAGER。在 Debian 上,用于查看输出的工具是确定如下:

  • 如果设置了-P(或) 选项,则使用该选项;--pager
  • 如果MANPAGER设置了环境变量,则使用它;
  • 如果PAGER设置了环境变量,则使用它;
  • 如果pager路径中存在且可执行,则使用它;
  • 否则(或者如果寻呼机被空值覆盖),请使用cat.

pagerDebian 上是less默认的(请参阅 参考资料readlink -f /usr/bin/pager)。cat如果分页器被非空但不可执行的值覆盖,则覆盖将不适用:将man -P non-existent失败并出现错误。

如果你想为PAGER等等设置你自己的值,你可以将它们添加到你的 shell 的启动文件中;对于 Bash(Debian 中的默认用户 shell),将它们添加到~/.bashrc.

您提到的环境变量(PAGEREDITORVISUAL)不必出现在进程的环境中,并且您不能期望它们出现。它们对于允​​许用户指定他们的首选项很有用,但您始终需要默认值。一些发行版尝试通过提供自己的通用命令来提供帮助,例如sensible-editorsensible-pagerDebian 中。看POSIX 为 shell 定义的环境变量,还是为任何不一定运行 shell 的进程定义的环境变量?对此进行更多讨论。

答案2

有很多man实现,但从man man常见的 人数据库Debian 上也使用的项目说:

   -P pager, --pager=pager
          Specify  which  output pager to use.  By default, man uses less,
          falling back to cat if less is not found or is  not  executable.
          This  option overrides the $MANPAGER environment variable, which
          in turn overrides the $PAGER environment variable.   It  is  not
          used in conjunction with -f or -k.

和:

  ENVIRONMENT
    (...)
       MANPAGER, PAGER
              If $MANPAGER or $PAGER is set ($MANPAGER is used in preference),
              its value is used as the name of the program used to display the
              manual page.  By default, less is used, falling back to  cat  if
              less is not found or is not executable.

因此,正如您所观察到的,如果既没有设置也没有设置,则默认 man使用less和。catMANPAGERPAGER

另外,请注意,在 shell 中,您不需要;像 C 中那样在每行末尾添加变量,并且可以在一行中完成导出变量:

export PAGER=''

或者只是为单个命令临时设置:

PAGER='' man man

答案3

要使用变量但回退到默认值,请使用${var:-default} 参数扩展:

"${PAGER:-less}" "$some_file"

要像 man 一样拥有默认值的级联列表:

myPager=""
for p in "$MANPAGER" "$PAGER" less cat; do
    myPager=$(type -p "$p") && break
done
if [[ -z $myPager ]]; then
    echo "Panic! not even cat can be found!" >&2
    exit 255
fi

相关内容