我正在尝试使用 wpa_cli 连接到 wifi。我跑了$ wpa_cli add_network
,回来了0,跑了$ wpa_cli set_network 0 ssid "my ssid"
。但这失败了。然后我尝试了交互式 shell,运行set_network 0 ssid "my ssid"
并得到了 OK?两者不应该要么失败要么运行得很好吗?为什么只有一个失败?
答案1
shell 执行的操作称为分词(您可以详细阅读)。对于大多数情况(以及您的情况),这意味着在命令行上,如果您想将任何一小组特殊字符传递给程序,您必须保护它们。为了保护它们,您必须在它们前面加上反斜杠 ( \
) 或用引号将相关文本括起来。
旁注:单引号在某种意义上“更强”,因为里面没有字符具有特殊含义。双引号允许某些字符保留其内部的特殊含义。
正如您可能从“分词”这个名称中猜到的那样,当您想要将空格传递给程序时,空格是您需要保护的内容之一。但从上面的引用规则可以明显看出,引号和反斜杠也需要受到保护。
问题是 wpa_cli 期望 SSID 周围有(双?)引号,但你的 SSID 被外壳“吃掉”,因为它们没有受到保护。现在,用wpa_cli set_network 0 ssid '"my ssid"'
单引号保护双引号,wpa_cli 命令将"my ssid"
其视为第四个参数。