【问题标题】:Can substring expansion be used in dash shell or bourne shell?可以在 dash shell 或 bourne shell 中使用子字符串扩展吗?
【发布时间】:2020-05-14 02:37:07
【问题描述】:

我正在将应用程序转换为新图像,现有命令使用子字符串扩展来设置工件版本,如下所示:mvn clean versions:set -DnewVersion="0.1.$VCSINFO.I${INFO:0:6}.M$OTHER_INFO"。我正在使用默认为 /bin/sh 的 ubuntu 映像,但我无法弄清楚如何在 bourne shell 中执行等效操作,或者切换 shell 以运行命令。我知道 bash 已安装,因为我可以在 /etc/shells 中看到它。

我尝试使用RUN ['/bin/bash', '-c', '...'],但我可以看到它只是像The command '/bin/sh -c ['/bin/bash', '-c',... 那样运行该命令。将此功能转换为新图像的最佳方法是什么?

【问题讨论】:

  • 您是否费心查看手册页?还是您只是将这些 shell 作为示例,并且真的很感兴趣是否可以在与 Posix 兼容的 shell 中使用此功能(正如您的 shell 标签所建议的那样)?后一种情况,你可以在POSIX standard找到答案。
  • 如果您尝试使用 RUNCMDENTRYPOINT 的 JSON 数组语法,它必须是带双引号的有效 JSON 数组。 ${A:B:C} 不是标准的 Bourne shell 变量扩展之一;它们列在@user1934428 的链接中。

标签: linux bash shell docker ubuntu


【解决方案1】:

您可以通过两种方式运行 bash 命令,甚至从 sh 中运行:通过将字符串 '/bin/bash path/to/your/cmd' 传递给 sh 的 -c 选项,或者通过设置 x 位在 cmd 中,并在 cmd 中的第一行是 #!/bin/bash

因此,在您的设置中,我会尝试使用RUN ['/bin/bash /path/to/your/cmd'] 或只是执行RUN ['/path/to/your/cmd'] 并确保cmd 具有上述#! 行,或者复杂但不安全 - 编写一个 sh 包装脚本,它然后依次调用 bash 脚本。因此,如果这个包装脚本被称为/path/to/your/cmdwrapper.sh,那么它的内容就是

:
/bin/bash /path/to/your/cmd

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 2010-09-16
    • 2012-04-16
    • 2012-05-21
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多