我知道
sh -c 'echo $1' sh 4
将输出4
. 和
sh -c 'echo $2' sh 4 5
将输出5
。
但是我不明白第二个之后的参数sh
是如何传递给后面的命令的。我阅读了和sh -c
的手册页,但找不到关于这种语法的介绍。bash
dash
答案1
这种行为实际上是由POSIX 标准,所有 Bourne 类外壳都应该支持该功能,以声明自己是可移植的。
sh -c [-abCefhimnuvx] [-o 选项]... [+abCefhimnuvx] [+o 选项]... 命令字符串 [命令名称 [参数...]]
看到command_string
参数了吗?现在我们来看看-c
标志描述:
-C
从 command_string 操作数读取命令。根据 command_name 操作数的值设置特殊参数 0 的值(参见特殊参数)以及从剩余参数操作数中按顺序排列的位置参数 ($1、$2 等)。不得从标准输入读取任何命令。
换句话说,普通 shell 脚本中的 where $0
(通常是交互模式下的 shell 名称或运行脚本时的脚本名称)将由 shell 本身设置,而-c
您必须自己指定。因此,
sh -c 'echo Hi, I am $0 , my first positional parameter is $1' foobar 5
会将进程名称设置为sh
foobar。
如果你想知道它$0
是什么,也可以在“特殊参数”部分中找到。Shell 命令语言规范:
0
(零。)扩展为 shell 或 shell 脚本的名称。
答案2
从man sh
:
-c string If the -c option is present, then commands are read from
string. If there are arguments after the string, they are
assigned to the positional parameters, starting with $0.
在您的命令中,第二个sh
只是一个具有位置的参数0
,而4
具有位置1
等等。
您可以运行此命令来检查:
$ sh -c 'echo $0' sh 4 5
sh