使用bash变量在Git中定义core.pager

使用bash变量在Git中定义core.pager,git,bash,Git,Bash,我想设置core.pager以管理包装文本的长行。为此,我使用以下命令: $ GIT_PAGER="fold -sw $COLUMNS" git log 我尝试设置core.pager,但Bash过早评估$COLUMNS: $ git config core.pager "fold -sw $COLUMNS" $ grep pager .git/config pager = fold -sw 80 如果我尝试转义$COLUMNS,我会得到: $ git config core.pag

我想设置core.pager以管理包装文本的长行。为此,我使用以下命令:

$ GIT_PAGER="fold -sw $COLUMNS" git log
我尝试设置core.pager,但Bash过早评估$COLUMNS:

$ git config core.pager "fold -sw $COLUMNS"
$ grep pager .git/config
    pager = fold -sw 80
如果我尝试转义$COLUMNS,我会得到:

$ git config core.pager "fold -sw \$COLUMNS"
$ grep pager .git/config
    pager = fold -sw $COLUMNS
$ LC_ALL=en_US git log
fold: option requires an argument -- 'w'
Try 'fold --help' for more information.
如果我尝试使用sh-c,我会得到:

…但它不能正确计算$COLUMNS,它是静态的

我如何获得与我在core.pager中设置的第一个命令相同的行为


编辑:正如Nick Bastin指出的,git config core.pager fold-sw\$COLUMNS应该可以工作,但可能我的子进程有问题。

因此,这不是一个特别的答案,但我已经像您在问题中一样测试了转义$COLUMNS,只要在我的shell中实际导出列,它就可以正常工作,否则它会像上面一样失败。您是否确定列是在shell中定义的,并且git的别名没有导致您丢失环境或别名为-no pager

编辑:尝试其他环境变量。事实证明,有很多东西需要编写COLUMNS变量,其中一个可能会把你搞砸我注意到fold会在我运行变量后重写它,所以它只工作一次。尝试将$COLUMNS更改为$FOO,看看这是否会有所不同

事实上,grep本身将系统上的$COLUMNS变量重写为终端的宽度,因此使用grep检查值可能会破坏它:

$ export COLUMNS=10
$ echo $COLUMNS
10
$ grep foo
^C
$ echo $COLUMNS
150

所以,这不是一个特别的答案,但我已经测试了转义$COLUMNS,就像您在问题中所做的那样,只要在我的shell中实际导出了列,它就可以正常工作,否则它会像您上面所说的那样失败。您是否确定列是在shell中定义的,并且git的别名没有导致您丢失环境或别名为-no pager

编辑:尝试其他环境变量。事实证明,有很多东西需要编写COLUMNS变量,其中一个可能会把你搞砸我注意到fold会在我运行变量后重写它,所以它只工作一次。尝试将$COLUMNS更改为$FOO,看看这是否会有所不同

事实上,grep本身将系统上的$COLUMNS变量重写为终端的宽度,因此使用grep检查值可能会破坏它:

$ export COLUMNS=10
$ echo $COLUMNS
10
$ grep foo
^C
$ echo $COLUMNS
150

解决了如下设置core.pager的问题:

$ git config core.pager "fold -sw \$(tput cols)"

感谢Nick Bastin,他展示了真正的问题和本主题:

解决了如下设置core.pager的问题:

$ git config core.pager "fold -sw \$(tput cols)"

感谢Nick Bastin,他展示了真正的问题和这个主题:

您是否考虑过使用一个寻呼机,它可以从您的终端仿真器中获取列,而无需明确告知?喜欢less@NevikRehnelless只有less-r,这对diff有好处,但对log没有好处,我可以在不将单词分成两部分的情况下得到一行新行。您是否考虑过使用一个寻呼机,它可以从您的终端仿真器中获取列,并且不需要显式地告知?喜欢less@NevikRehnelless只有less-r,这对diff很好,但对日志不好,在日志中我可以得到一行新行,而不需要将一个单词分成两部分。echo$COLUMNS可以工作,而且我没有shell别名。我有一个非常简单的git配置,我在Bash 4.2.42中使用Konsole KDE 4.10.1。@FrancescofRasinelli:我能够做上面做的第二件事,即对其进行转义,使.git/config编写正确,然后执行export COLUMNS=5将动态地将列数更改为5,这当然是很有趣的不可读。在子进程中,您的环境一定有问题。@FrancescofRasinelli:检查我编辑的帖子-我认为您的问题实际上是grep重置变量的值。您是对的:如果我导出COLUMNS=$COLUMNS,它会工作,grep不是检查它的好方法,但这不是主要问题。也许寻呼机是在另一个无法看到原始$COLUMNS的bash进程中执行的?@FrancescofRasinelli:测试方法是将您想要的值分配给一个其他人不会使用的变量,如export KDFK=$COLUMNS,然后在配置中使用$KDFK-如果可行,然后就有人搞乱了你的列变量。如果它也有同样的问题,那么子进程环境通常会出现问题,这将非常奇怪。echo$COLUMNS可以工作,我没有shell别名。我有一个非常简单的git配置,我在Bash 4.2.42中使用Konsole KDE 4.10.1。@FrancescofRasinelli:我能够做上面做的第二件事,即对其进行转义,使.git/config编写正确,然后执行export COLUMNS=5将动态地将列数更改为5,这当然是很有趣的不可读。在子进程中,您的环境一定有问题。@FrancescofRasinelli:查看我编辑的帖子-我认为您的问题实际上是grep重置了变量的值。您是对的:如果我导出了COLU
MNS=$COLUMNS它可以工作,grep不是检查它的好方法,但它不是主要问题。也许寻呼机是在另一个无法看到原始$COLUMNS的bash进程中执行的?@FrancescofRasinelli:测试方法是将您想要的值分配给一个其他人不会使用的变量,如export KDFK=$COLUMNS,然后在配置中使用$KDFK-如果可行,然后就有人搞乱了你的列变量。如果它有同样的问题,那么您通常会遇到子进程环境的问题,这将非常奇怪。