当前位置: 首页 > 知识库问答 >
问题:

将变量值作为命令执行与直接在shell中执行会产生不同的结果

郭皓
2023-03-14

我遇到了一个mvn命令的问题,我正在构建为变量值,然后执行。

如果我直接执行命令,作为变量值的回显,它可以完美地工作。但是,如果我执行变量值,它会给我一个错误,就像其中一个参数不在双引号内一样。

我需要构建该命令,因为参数依赖于来自其他脚本的某些变量名,而不是运行这些脚本。

这些是命令:

有了这个,我将maven命令存储在一个变量中,如果$CLOUD值为真,则带有一些额外的参数:

$ export CLOUD=true && export mvn_cmd="mvn clean test --batch-mode $(if [[ "$CLOUD" == "true" ]]; then echo -Ddevice=\"Samsung Galaxy J7 Prime\" -DnetworkLog=true; fi) -Dcucumber.filter.tags=\"@tmsLink=ID-16848\""

如果我回显命令是完全可以的:

$ echo $mvn_cmd
mvn clean test --batch-mode -Ddevice="Samsung Galaxy J7 Prime" -DnetworkLog=true -Dcucumber.filter.tags="@tmsLink=ID-16848"

如果我用以下代码运行:

$ $mvn_cmd
...
[ERROR] Unknown lifecycle phase "Galaxy". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]

但是,如果我直接在终端中复制并粘贴变量的输出,它将完美运行:

$ mvn clean test --batch-mode -Ddevice="Samsung Galaxy J7 Prime" -DnetworkLog=true -Dcucumber.filter.tags="@tmsLink=TUF-16848"
...
[INFO]
[INFO] --- maven-surefire-plugin:3.0.0-M5:test (default-test) @ flow ---
[INFO]
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------

有什么想法吗?提前感谢!

共有1个答案

鲜于致远
2023-03-14

所以,问题是

    < li >您将命令存储在shell变量中,而不是存储在函数中,并且 < li >您没有引用您的shell变量,并且 < li >如果引用正确,您必须使用< code>eval或类似工具来执行它。

试试这个(未经测试,假设你使用的是最新版本的bash):

mvn_cmd() {
    local args
    [[ "$CLOUD" == "true" ]] && args='-Ddevice="Samsung Galaxy J7 Prime" -DnetworkLog=true'
    mvn clean test --batch-mode ${args:?"$args"} -Dcucumber.filter.tags="@tmsLink=ID-16848"
}

mvn_cmd
 类似资料:
  • 问题内容: 我需要将我执行的shell命令的结果存储在一个变量中,但是我无法使其工作。我尝试像: 但是它将结果打印在终端中,并将call的值打印为零,可能表示成功。如何将结果存储在变量中? 问题答案: 改用模块: 编辑:这是Python 2.7中的新功能。在早期版本中,这应该可以工作(命令重写如下所示): 作为旁注,您可以重写 至 您甚至可以用一个脚本替换整个语句: 导致:

  • 问题内容: 我正在寻找在Go中执行shell命令,并在程序中以字符串形式获取结果输出。我看到了Rosetta Code 版本: 但这并不能以我可以通过编程方式访问的方式捕获实际的标准或错误-那些仍会打印到常规的stdout / stderr。我看到使用Pipe作为out或err可以在其他地方提供帮助,但是没有如何执行此操作的示例。有任何想法吗? 问题答案: 该答案不代表Go标准库的当前状态。请查看

  • 问题内容: 我仍在尝试掌握如何运行linux或Windows shell命令并在node.js中捕获输出的细节。最终,我想做这样的事情… 重要的一点是必须对全局范围的变量(或对象)可用。我尝试了以下功能,但是由于某种原因,我被打印到控制台了。 我很难理解代码在哪里突破了…该模型的非常简单的原型可以工作… 有人可以帮助我了解为什么有效,但是无效吗?FWIW,我需要使用,因为缓冲区限制为200KB。

  • 我有一个案例,我想问我可以解决与Spring壳。我有一个Main.jar应用程序,它有几个部署在Wildly服务器上的Spring任务。在我的例子中,我不能停止或重新部署main.jar,因为必须不停地提供服务。

  • 问题内容: 在Java8中运行以下流示例: 产量: 当然-这并不奇怪。由于http://docs.oracle.com/javase/8/docs/api/index.html?overview- summary.html ,流是顺序执行还是并行执行都没有关系: 除了标识为明确不确定的操作(例如findAny())之外,流是顺序执行还是并行执行都不应该更改计算结果。 AFAIK 是确定性的并且是关

  • 问题内容: 当我尝试去做 我得到一个空的输出。 预期输出为: 问题答案: 如果没有输出,通常是因为命令无法启动。 阅读()以检查是否有任何错误。