当我尝试使用这些环境变量时,我得到一个空字符串:
$ $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
.
pager
Debian 上是less
默认的(请参阅 参考资料readlink -f /usr/bin/pager
)。cat
如果分页器被非空但不可执行的值覆盖,则覆盖将不适用:将man -P non-existent
失败并出现错误。
如果你想为PAGER
等等设置你自己的值,你可以将它们添加到你的 shell 的启动文件中;对于 Bash(Debian 中的默认用户 shell),将它们添加到~/.bashrc
.
您提到的环境变量(PAGER
、EDITOR
、VISUAL
)不必出现在进程的环境中,并且您不能期望它们出现。它们对于允许用户指定他们的首选项很有用,但您始终需要默认值。一些发行版尝试通过提供自己的通用命令来提供帮助,例如sensible-editor
在sensible-pager
Debian 中。看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
和。cat
MANPAGER
PAGER
另外,请注意,在 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