【问题标题】:Git alias command with bash script egrep produces different results带有 bash 脚本 egrep 的 Git 别名命令会产生不同的结果
【发布时间】:2016-01-19 10:15:21
【问题描述】:

这是 git 中非常基本的 shell 别名的示例

[alias]
    em = "!git branch --merged | egrep -v '\\*\\|master' | xargs -L 1 -n 1 echo"

它回显已合并的分支,不包括主分支(以及您所在的当前分支)。很简单。但是,当运行此别名和仅运行脚本时,结果会有所不同。示例:

will ~/example master 
$ git branch --merged | egrep -v '\\*\\|master' | xargs -L 1 -n 1 echo
feature
will ~/example master 
$ git em
feature
*
master

由于某种原因,它就像 egrep 子句甚至没有运行。事实上(因为我是 OS X)它几乎就像它运行 grep 命令一样!像这样:(注意grep vs egrep

will ~/example master 
$ git branch --merged | grep -v '\\*\\|master' | xargs -L 1 -n 1 echo
feature
*
master

以前有人遇到过这种情况吗?

我已经阅读了这些 SO 问题,但它们处理的问题与我不同。顶部是最接近的,但与运行 shell 命令别名的位置(repo 的顶层)有关。

Why does running command as git alias gives different results?

Bash script produces different result when executed from shell prompt than executed by cron

【问题讨论】:

  • 不相关,但-L-nxargs 的互斥选项;只使用最后一个。
  • 真的!除了在 Legacy 模式下:“LEGACY 说明在 legacy 模式下,-L 选项将所有换行符视为行尾,无论该行是空的还是以空格结尾。此外,-L 和 -n 选项是不是互斥的。” man pages

标签: regex git bash grep


【解决方案1】:

似乎别名定义在定义之前经历了一定数量的外壳处理(或至少反斜杠处理)。将另一个组转义反斜杠添加到别名。

[alias]
  em = "!git branch --merged | egrep -v '\\\\*\\\\|master' | xargs -L 1 -n 1 echo"

【讨论】:

  • 谢谢!我还发现删除 scond 反斜杠有效:\\*|master
猜你喜欢
  • 2022-09-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多