xargs 命令在 bash 别名中使用时静默失败

xargs command silently fails when used in a bash alias

在命令行中,这会在我的 phpstorm 应用程序中打开两个文件:

git diff --name-only final-migration | xargs pstorm

当我在 ~/.bash_profile 中创建别名时:

alias ropen="git diff --name-only  | xargs pstorm"

并从与成功命令相同的目录中调用它:

ropen final-migration

什么都没有发生。我已经尝试更改别名,使其回显而不是按预期工作的 xargs pstorm。似乎 xargs 是在别名中使用时的问题所在。我不确定我错过了什么。

第一个问题

别名不适用于 </code> 等参数。别名使用参数的唯一方法是将它们放在末尾。但是即使 <code> 对别名有效,你的定义也不起作用,因为 "" 在定义时被扩展了。
您可以使用 echo "" 打印 "" 的值。对我来说,它是空的。所以别名...

alias ropen="git diff --name-only  | xargs pstorm"

... 等同于 ...

alias ropen="git diff --name-only | xargs pstorm"

要按预期使用 </code>,请编写一个函数:</p> <pre><code>ropen() { git diff --name-only "" | xargs pstorm; }

可能的第二个问题

如果打印的路径包含空格,

xargs 将破坏参数。 假设 git diff --names-only 将打印路径 a b/cx/y z,然后 xargs 将构造命令 pstorm "a" "b/c" "x/y" "z"。 None 个文件存在。

要允许空格,请使用 xargs -d '\n' pstorm,这将构造正确的命令 pstorm "a b/c" "x/y z"

问题出在 OSX 随附的 xargs 版本上。通过使用 GNU 版本,@socowi 关于使用函数的建议非常有效。

为了安装 xargs 的 gnu 版本,我按照@Benjamin W 所说的那样做了,并使用 homebrew 安装了 findutils。然后我按照安装 findutils 的建议添加了路径到我的 ~/.bash_profile.