1

我想设置 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 中设置的第一个命令相同的行为?

编辑:正如尼克巴斯汀所说git config core.pager "fold -sw \$COLUMNS",应该可以工作,但可能我对子进程有问题。

4

2 回答 2

5

像这样解决了设置 core.pager :

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

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

于 2013-03-16T10:57:57.017 回答
2

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

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

而且,实际上,它本身会将我系统上grep的变量重写为终端的宽度,因此通过使用来检查您可能会破坏它的值:$COLUMNSgrep

$ export COLUMNS=10
$ echo $COLUMNS
10
$ grep foo
^C
$ echo $COLUMNS
150
于 2013-03-16T09:45:09.433 回答