我经常遇到用/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
包装才能正确执行。