首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么要使用"/bin/bash -c $command“而不是直接调用"$command”呢?

为什么要使用"/bin/bash -c $command“而不是直接调用"$command”呢?
EN

Stack Overflow用户
提问于 2022-03-19 22:45:28
回答 1查看 516关注 0票数 0

我经常会遇到用/bin/bash -c/bin/sh -c而不是直接执行的命令。例如,不是cp /tmp/file1 /tmp/file2,而是/bin/bash -c "cp /tmp/file1 /tmp/file2"

这样做而不是直接执行命令的原因是什么?在最近的记忆中,我在Docker和K8s命令中看到的最多。我唯一能真正想到的是,因为您特别希望使用特定的shell运行命令,但这似乎是非常罕见的/小众的用例吗?

这里是一个特定的示例,k8s部署使用:

代码语言:javascript
复制
command: ["/bin/sh"]
args: ["-c", ". /config/dynamicenv.sh && /app/bin/docker-entrypoint server"]

而不是我所期望的默认情况:

代码语言:javascript
复制
. /config/dynamicenv.sh && /app/bin/docker-entrypoint server
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-20 01:05:19

如果没有具体的示例,很难判断,但是这样做的一个常见原因是您希望使用shell i/o重定向、管道等等。例如,Kubernetes荚清单的这个片段将失败,因为它涉及一个管道,这需要shell执行命令行:

代码语言:javascript
复制
containers:
  image: docker.io/alpine:latest
  command:
    - echo hello world | sed s/world/container/

但这样做是可行的:

代码语言:javascript
复制
containers:
  image: docker.io/alpine:latest
  command:
    - /bin/sh
    - -c
    - echo hello world | sed s/world/container/

这是一种相对常见的情况,在这种情况下,您将看到一些事情使用shell显式执行。如果你想用一些具体的例子来更新你的问题,我们可以提供一个更彻底的答案。

你的例子非常接近我在回答中已经包含的内容。命令. /config/dynamicenv.sh && /app/bin/docker-entrypoint server不是一个简单的命令;它是一个同时使用.&&运算符的shell脚本。

如果他们要写:

代码语言:javascript
复制
command: [". /config/dynamicenv.sh && /app/bin/docker-entrypoint server"]

如果出现以下错误,它就会失败:

代码语言:javascript
复制
exec: "[\". /config/dynamicenv.sh && /app/bin/docker-entrypoint server\"]": stat [". /config/dynamicenv.sh && /app/bin/docker-entrypoint server"]: no such file or directory: unknown.

为了正确执行命令,需要使用sh -c包装该命令。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71542693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档