【问题标题】:bash aliases in xargs: "bash -c" does not pass arguments to commandxargs 中的 bash 别名:“bash -c”不将参数传递给命令
【发布时间】:2015-07-01 19:09:17
【问题描述】:

为了识别“xargs”中的别名,我设置了一个别名

alias xargs="xargs bash -ic"

如果我现在执行下面的 sn-p,则不会将任何参数传递给 xargs 的命令。

find . -name pom.xml | xargs grep projectid

事实上,即使在这种情况下,也不会向命令传递任何参数。

bash -ic grep projectid pom.xml

bash 的文档说

-c 如果存在 -c 选项,则从第一个非选项中读取命令 参数命令字符串。如果 command_string 后面有参数,它们 分配给位置参数,从 $0 开始。

那我做错了什么?

bash --version
GNU bash, version 4.3.39(2)-release (x86_64-unknown-cygwin)

更新
感谢@knittl 的投入。现在的解决方案可以避免@knittl 答案中的所有额外标点符号。
1. 下载xargs_bash_alias.sh
2.设置别名

alias xargs="<path>/xargs_bash_alias.sh"

现在您的 xargs 命令将识别您的其他 bash 别名。

【问题讨论】:

  • bash -c grep projectid pom.xml 执行命令grep 并具有位置参数$0 (projectid) 和$1 (pom.xml`)。您的命令未使用位置参数。
  • 您知道"$*" 不适用于多字参数吗?
  • 我不知道。不是 bash 大师。你有什么建议吗?
  • 看我的回答,我不明白为什么它不适用于你的场景
  • 你的答案有效。我确实感谢你的投入:-)。我想避免命令中所有额外的标点符号。使用该脚本,我只需键入“find | xargs grep ”。因此,如果设置了 bash 别名,现在将使用“grep --color”。

标签: linux bash xargs


【解决方案1】:

您需要注意两件事。首先,正确引用:

find . -name pom.xml -print0 | xargs -0 bash -c "grep projectid"

其次,您需要以某种方式传递位置参数:

find . -name pom.xml -print0 | xargs -0 bash -c 'grep projectid "$@"' -

使用 - 作为 bash 的第一个参数,因此位置参数从 $1 开始,就像在普通的 shellscript 中一样。

"$@" 扩展为从 1 开始的引用位置参数。 由于 xargs 一次传递多个参数,您要么需要在 bash 脚本中使用 "$@"(引用!),要么使用 -n1 选项运行 xargs。

【讨论】:

  • 也就是说,在您的示例中,您根本不需要 bash。只需使用普通的 xargs:find . -name pom.xml -print0 | xargs -0 grep projectid
  • 在 bashrc 中设置的别名不能被 xargs 识别。因此我需要使用“bash -ic”。在某处阅读。
  • @KiranMohan:你和我没有在 xargs 中使用别名。
  • 可以说我设置了“alias grep='grep --color'”。 xargs 不会使用 grep 的别名版本。
  • @KiranMohan:是的,但这不是你问题的一部分。
猜你喜欢
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 2011-05-02
  • 2021-04-30
  • 1970-01-01
  • 2023-04-05
  • 2011-10-23
相关资源
最近更新 更多