禁用管道内的DEBUG陷阱



我正在使用vim&航空站由于我经常问自己是哪家回购/分支机构,我想每次我发出(一组(命令时,外壳都会告诉我这一点。

一个简单的方法是使用trap 'git config --get remote.origin.url' DEBUG

它完成了任务,但有一个令人讨厌的副作用:陷阱由管道中的所有命令触发。因此,repo url会被打印多次。

$ls | echo yes
git@gitlab.com:development.git
git@gitlab.com:development.git
yes

如何使陷阱仅由管道中的第一个(或最后一个(命令触发?

我尝试使用[ -p /dev/stdout ] or [ -p /dev/stdin]这样的测试条件,但不起作用:

$trap -- '{ [ -p /dev/stdout ] && return ;} || echo knock' DEBUG
$ls | echo yes
knock
knock
yes

注意,对于这两个命令,stdout似乎都连接到一个管道:

$trap -- '[ -p /dev/stdout ] ; echo -p: $? ' DEBUG
$ls | echo yes
-p: 1
-p: 1
yes

但是,当以交互方式发出时,这种情况确实会识别管道

${ [ -p /dev/stdout ] ; echo A-p: $? >/dev/stderr ;} | { [ -p /dev/stdout ] ; echo B-p: $? ;}
A-p: 0
B-p: 1

我无法在help trap上识别出任何有帮助的标志。

这可能吗?

首先,我建议您只运行trap中的函数,而不是多语句脚本(这是为了简单起见(。

其次,DEBUG陷阱并不是一个很好的方法。我不知道如何在管道上禁用DEBUG,甚至不知道你是否可以。然而,可能还有另一种方法可以解决你的问题。

第三个也是最后一个,您可以将PROMPT_COMMAND视为一个脚本,在即将显示提示时运行(它在管道之后但在PS1显示之前运行一次(。

因此:

PROMPT_COMMAND+=$'nls | echo yes'

这将在脚本中添加一个命令,并在我认为您需要的时间运行它。这不仅没有滥用DEBUG那么麻烦,而且效率高得多。

您可能还希望查看git项目中的git-prompt.sh:https://github.com/git/git/blob/master/contrib/completion/git-prompt.sh这是在git repo中显示当前分支的标准解决方案。它提供了外壳函数__git_ps,它通常从PS1使用,但也可以从PROMPT_COMMAND使用。

此函数将在括号中打印当前分支,但也将打印其他相关信息(如果相关(:是否正在进行rebase或cherry pick,是否处于分离的HEAD状态,等等。

相关内容

  • 没有找到相关文章

最新更新