如何在 `-c` 命令字符串中使用 `sh` 的命令行参数?

如何在 `-c` 命令字符串中使用 `sh` 的命令行参数?

我知道

sh -c 'echo $1' sh 4

将输出4. 和

sh -c 'echo $2' sh 4 5

将输出5

但是我不明白第二个之后的参数sh是如何传递给后面的命令的。我阅读了和sh -c的手册页,但找不到关于这种语法的介绍。bashdash

答案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

会将进程名称设置为shfoobar。

如果你想知道它$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

相关内容