我想设置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"
应该有效,但可能我对子进程有疑问。
答案 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