编写 Dockerfile 时,经常使用到 /bin/sh -c
命令,一直不懂是什么意思
执行
1 | man /bin/sh |
打开 man page,查看说明文档,可以看到相关解释
1 | -c Read commands from the command_string operand instead of from the standard input. Special parameter 0 will be set from the command_name operand and the positional parameters ($1, $2, etc.) set from the remaining argument operands. |
也就是说,如果带上 -c
参数的话,会把参数后面的值当作命令行,而不是普通的字符串。比如执行如下命令
1 | /bin/sh ls |
会输出
1 | root@iZ94fg0bhwgrgtZ:/# /bin/sh ls |
如果带上了 -c
参数,变成这样 /bin/sh -c ls
,会输出
1 | root@iZ94fg0bhwgrgtZ:/# /bin/sh -c ls |
可以看到输出结果和执行 ls
命令的结果是一样的。/bin/sh
带上了 -c
参数就会把后面的字符串当作命令执行,在这里就是执行了 ls
命令
如果 -c
后面的命令行有空格隔开,可以使用双引号括起来,比如
1 | /bin/sh -c "ls -al" |
这样就相当于执行了 ls -al
命令