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

时间:2013-03-16 09:35:20

标签: 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.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,我会:

$ git config core.pager 'sh -c fold -sw $COLUMNS'
$ grep pager .git/config
    pager = sh -c fold -sw $COLUMNS

..但它没有正确评估$ COLUMNS(它是静态的)。

我怎么能得到我在core.pager中设置的第一个命令的相同行为?

编辑:正如Nick Bastin所指出的git config core.pager "fold -sw \$COLUMNS"应该有效,但可能我对子进程有疑问。

2 个答案:

答案 0 :(得分:5)

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

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

感谢Nick Bastin(显示了真正的问题)和这个主题:LINES and COLUMNS environmental variables lost in a script

答案 1 :(得分:2)

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

编辑:尝试使用其他环境变量。事实证明,有很多东西需要编写COLUMNS变量,其中一个可能会搞砸你(我注意到fold会在我运行后重写变量,所以它无论如何只能工作一次)。尝试将$COLUMNS更改为$FOO并查看是否会产生影响。

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

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