【发布时间】: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和-n是xargs的互斥选项;只使用最后一个。 -
真的!除了在 Legacy 模式下:“LEGACY 说明在 legacy 模式下,-L 选项将所有换行符视为行尾,无论该行是空的还是以空格结尾。此外,-L 和 -n 选项是不是互斥的。” man pages