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



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

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

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

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

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

ropen final-migration

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

第一个问题

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

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

。相当于...

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

要按预期使用$1,请编写一个函数:

ropen() { git diff --name-only "$1" | xargs pstorm; }

可能的第二个问题

如果打印的路径包含空格,xargs将修改参数。 假设git diff --names-only将打印路径a b/cx/y z,然后xargs将构造命令pstorm "a" "b/c" "x/y" "z"。这些文件都不存在。

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

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

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

最新更新