【问题标题】:Take a comma separated string and add it into a command取一个逗号分隔的字符串并将其添加到命令中
【发布时间】:2019-10-02 19:16:00
【问题描述】:

有人知道我在这里做错了什么吗? DIFFS 在第 1 行 (foo/bar,baz/bat.php) 之后包含以逗号分隔的文件路径列表。如果我只是将其复制粘贴到实际终端中第 2 行的其余部分中,我会得到我所期望的。通过我所在的脚本执行此操作只会永远运行,然后返回一个新提示,没有错误。我已经尝试了一些东西,但我的 bash fu 超级弱......:S

#!/bin/bash

...

function phpmd() {
    DIFFS=`git diff development --name-only | xargs | sed 's/ /,/g'`
    phpmd ${DIFFS} text phpmd.xml
}

...

case "$1" in
somecase)
   somecase ${@:2}
   ;;
phpmd)
   phpmd
   ;;
....
*)
   showUsage)
   ;;
esac

即使我只是在 iTerm 中执行此操作,它也可以。

prompt$ DIFFS=`git diff development --name-only | xargs | sed 's/ /,/g'`
prompt$ phpmd $DIFFS text phpmd.xml
/path/to/SomeController.php:58  The class SomeController has 1046 lines of code. Current threshold is 1000. Avoid really long classes.
...

编辑:如果这很重要,它在更大的脚本中被称为function,如下所示。编辑了上面的代码块以反映。我在一个独立的函数中使用了这两行代码,它们工作得很好,所以我对更广泛的脚本 obvs 不太了解...

set -x 输出:

+ set -x
++ git diff development --name-only
++ xargs
++ sed 's/ /,/g'
+ DIFFS=app/Http/Controllers/TrackerController.php,docker/kubernetes/configmap-php-ini-worker.yaml,src/Packages/CoreFilter.php
+ phpmd app/Http/Controllers/TrackerController.php,docker/kubernetes/configmap-php-ini-worker.yaml,src/Packages/CoreFilter.php text phpmd.xml

只是循环数百次直到我 Ctrl+C

【问题讨论】:

  • 请在您的问题中添加示例输入(无描述、无图像、无链接)以及该示例输入所需的输出(无评论)。
  • 如果我理解正确,您显示的两行在命令行执行时可以正常工作,但不能在 shell 脚本中执行。假设这是正确的,您可以在 shell 脚本中的两行之间添加 echo $DIFFS,以查看结果是否与您的预期不同。
  • 调试shell脚本的第一步是将set -x放在开头。这将使它在执行时显示每一行,并扩展变量。
  • 顺便说一句,改掉使用大写变量名的习惯。这些通常是为环境变量保留的。
  • 没有样本输入,它从git diff 中提取文件列表,然后应该将它们用作phpmd 的第一个参数。当我手动执行此操作时,上述代码块中以 /path/to/SomeController... 开头的最后一行是所需的输出。当我使用 set -x 时,它完全符合我的预期,但它循环了数百次,甚至数千次。

标签: bash command-line phpmd


【解决方案1】:

函数phpmd 的声明将phpmd 程序“隐藏”在您的路径上。您应该将您的函数重命名为其他名称:

function runphpmd() {

同时更新调用站点:

phpmd)
   runphpmd
   ;;

或者,您可以使用the command builtin 来避免递归调用名为phpmd 的函数:

function phpmd() {
    DIFFS=`git diff development --name-only | xargs | sed 's/ /,/g'`
    command phpmd ${DIFFS} text phpmd.xml
}

来自command 的文档:

使用参数运行command,忽略任何名为command的shell函数。

【讨论】:

  • 就是这样!谢谢朋友!
猜你喜欢
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2022-01-17
  • 2011-08-31
相关资源
最近更新 更多