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/c
和 x/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.
在命令行中,这会在我的 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/c
和 x/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.