"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
)做某事。
sh
、ksh
、csh
、bash
都是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 作为可以从文件执行的命令的单个参数的方法。
假设回显命令,我们可以通过两种方式运行该命令:
# 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
)做某事。
sh
、ksh
、csh
、bash
都是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 作为可以从文件执行的命令的单个参数的方法。