"sh -c 'some comand'" 和直接 运行 有什么区别吗

Is there any difference between "sh -c 'some comand'" and directly run some command

假设回显命令,我们可以通过两种方式运行该命令:

# by 1
echo 'hello'
# or by 2
sh -c "echo 'hello'"

这两种方式有什么区别吗?顺便说一下,我可以看到方式 2 在 yaml 配置文件中非常流行。

- name: init-mydb
  image: busybox:1.28
  command: ['sh', '-c', "sleep 2; done"]

第一种方式调用继承的命令解释器,例如从终端 运行ning /bin/bash ;第二种方式 exec sh(又名 Bourne Shell)作为解释器并指示他(-c)做某事。

shkshcshbash都是shell口译员。它们提供的一些特性在它们之间并不总是兼容。所以,如果你不知道你的程序运行的环境运行,最好是指定你想要的解释器,这样更不容易出错。

这是一条命令:

foo 1 2 3

这个也是

sh -c 'foo 1 2 3'

不是单个命令(而是一对由;分隔的命令)

foo; bar

但这是

sh -c "foo; bar"

这没有使用可执行文件的名称指定命令

for x in 1 2 3; do echo "$x"; done

但这确实

sh -c 'for x in 1 2 3; do echo "$x"; done'

sh -c 基本上是指定任意 shell script 作为可以从文件执行的命令的单个参数的方法。