我有一组脚本,它们都来自一些共同的上下文:
DEFAULT_PAGINATION=''
ownContext=$HOME/.config/exploitation/context.sh
if [ -f "$ownContext" ]; then
# shellcheck source=$HOME/.config/exploitation/context.sh
. "$ownContext"
fi
这样任何人都可以覆盖默认配置:一些位置,帮助标志,在这种情况下,分页。
例如,要自动重定向到更少,我尝试过:
# DEFAULT_PAGINATION is the default pagination tool (a program)
# OUTPUT_PAGINATION_FILE acts as an include guard, or contains a filename
if [ -n "$DEFAULT_PAGINATION" ] && [ -z "$OUTPUT_PAGINATION_FILE" ]; then
paginate() {
$DEFAULT_PAGINATION "$OUTPUT_PAGINATION_FILE" # paginate tempfile
}
trap paginate exit
OUTPUT_PAGINATION_FILE=$(mktemp)
export OUTPUT_PAGINATION_FILE
exec 1<&- # close stdout
exec 1<>"$OUTPUT_PAGINATION_FILE" # redirect stdout to a temp file
fi
在另一个上下文文件中,export DEFAULT_PAGINATION=less
但它不起作用。任何想法 ?
另外,该解决方案不允许export DEFAULT_PAGINATION="less +F"
即时重定向。有解决方案吗?
PSbash
标签是故意的
我不确定它是否只能通过采购一些东西来完成。可以使用自定义解释器(包装器)来完成。
将此示例代码另存为
bash-pager
:使其可执行 (
chmod +x bash-pager
)。然后将您提到的这些脚本的 shebang 更改为或者也许(如果
bash-pager
可以通过$PATH
)到:实际上,如果您已
PAGER
设置并导出,脚本将使用它。我使用
PAGER
它是因为它有点标准。您可能希望您的bash-pager
外观更像这样:笔记:
$DEFAULT_PAGINATION
,它与 一起使用sh -c
,因此您可以传递带有参数(例如DEFAULT_PAGINATION='cat -n'
)或管道的命令。[ -t 1 ]
检查 stdout 是否是终端。多亏了这种预防措施,您仍然可以跑步one_of_your_scripts | whatever
并且DEFAULT_PAGINATION
不会受到干扰。PAGER
仍然可以使用。看到这个问题。我不知道该怎么
context.sh
做。几个问题:context.sh
在解释器的上下文中可能会做一些您不想要的事情,因此bash-pager
可能不需要采购它。context.sh
可能会在脚本中做一些你明确想要的事情,所以无论如何你都想在每个脚本中获取它。context.sh
可能需要bash
. Notebash-pager
旨在进行包装,bash
但其解释器(shebang)是/bin/sh
. 更改为bash
虽然微不足道。context.sh
可以set
用来改变$@
. 如果确实如此,那么"$@"
以后bash-pager
可能无法扩展到我们需要的内容。这是给你解决的。注意解释器只需要
DEFAULT_PAGINATION
/PAGER
。您可以告诉用户在他们的profile
(如果他们想要该功能)中设置和导出其中之一。然后bash-pager
就不需要采购任何东西了。假设
script1.sh
您想使用less
.您可以创建一个包装脚本,该脚本将
script1.sh
像这样分页:当您运行包装器脚本时,它将运行
script1.sh
并使用less
.有什么理由不适合你吗?