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

  • 本文关键字:command 调用 bash bin bash shell sh
  • 更新时间 :
  • 英文 :


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

为什么要这样做而不是直接执行命令?在最近的记忆中,我在Docker和K8s命令中看到的最多。我唯一能想到的是,因为你特别想用一个特定的shell运行命令,但这似乎是一个非常罕见/利基的用例?

下面是一个具体的例子,k8s部署使用:

command: ["/bin/sh"]
args: ["-c", ". /config/dynamicenv.sh && /app/bin/docker-entrypoint server"]

而不是我所期望的默认值:

. /config/dynamicenv.sh && /app/bin/docker-entrypoint server

如果没有具体的例子,这很难说,但这样做的一个常见原因是你想利用shell i/o重定向、管道等。例如,Kubernetes pod清单的这个片段会失败,因为它涉及一个管道,这需要shell执行命令行:

containers:
image: docker.io/alpine:latest
command:
- echo hello world | sed s/world/container/

但这是可行的:

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脚本。

如果他们要写:

command: [". /config/dynamicenv.sh && /app/bin/docker-entrypoint server"]

它将失败,错误如下:

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包装才能正确执行。

相关内容

  • 没有找到相关文章

最新更新