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

时间:2018-07-05 09:21:56

标签: bash alias xargs

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

<select label="gender" value="male">
<option value={"male"}>male</option>
<option value={"female"}>female</option>
<option value={"others"}>others</option>
</select>

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

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

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

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

什么都没有发生。我尝试更改别名,以使它回显而不是像预期的那样工作的ropen final-migration 。似乎xargs pstorm是在别名中使用问题所在。.我不确定我要丢失什么。

2 个答案:

答案 0 :(得分:1)

第一个问题

别名不能与$1之类的参数一起使用。别名使用参数的唯一方法是将其放在最后。但是,即使$1适用于别名,您的定义也不起作用,因为"$1"在定义时已扩展。
您可以使用"$1"打印echo "$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"

答案 1 :(得分:0)

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

要安装xargs的gnu版本,我就像@Benjamin W所说的那样,并使用自制程序安装findutils。然后,我按照建议将安装findutils的路径添加到了我的〜/ .bash_profile。