bash 联机帮助页对该选项的说明如下-c
:
-c 如果存在 -c 选项,则从第一个非选项参数 command_string 读取命令。如果 command_string 之后有参数,则第一个参数将分配给 $0,任何剩余参数将分配给位置参数。对 $0 的赋值设置了 shell 的名称,该名称用于警告和错误消息。
从上面我希望下面的代码在其输出中是等效的:
# or possibly (`bash -c date date +%z`)
$ bash -c date +%z
Wed Oct 18 10:02:47 PM UTC 2023
$ date +%z
+0000
# The first command gives the output of `date` without the format specifier.
然而,我的 bash(GNU bash,版本 5.2.15)似乎从未评估额外的命令行位置参数。选项后第一个参数之后的所有内容-c
都会被默默丢弃。也许我误解了手册页。
如何将多个参数bash -c
作为单词(底层的 arg 向量)而不是一个字符串 ( bash -c "date +%z"
) 传递给命令?这可能吗?
语境
我问这个问题的目的是了解 bash 如何期望传递命令参数,以便通过execve()
另一个程序(包装外壳)中的函数系列之一将它们正确地输入到 bash 中。
$0 不是第一个参数,$1 是。此外,您需要使用命令字符串中的参数。
-c 的参数必须是一个字符串。其余的将是参数 $0, $1, ...
例子:
输出:
name=a params=b c
此处单引号的使用很重要。因为它不允许当前 shell 填充 $0、$* 等值。
如果您想从当前 shell 中获取值,请使用双引号。例如:
输出:
42
混合单引号和双引号也是可能的。只要 -c 后面的参数仍然是一个字符串。
输出:(
42 0=bash
这里$0默认为bash)