变量赋值后在同一行上运行命令是否可移植?

tes*_*est 7 shell posix

是否有任何标准涵盖在同一行上的变量赋值后运行命令的可移植性?

APPLE="cider" echo hi
Run Code Online (Sandbox Code Playgroud)

这样的东西有多便携?它会在哪里工作,在哪里不会?

另外:如果这有什么不同,我的 shell 脚本以 #!/bin/sh 开头。

phe*_*mer 6

只要您使用的是符合 POSIX 标准的 shell,就可以。

来自shell命令语言POSIX定义:(相关点以粗体显示)

“简单命令”是一系列可选的变量赋值和重定向,以任何顺序,可选地跟随单词和重定向,由控制运算符终止。

当需要执行给定的简单命令时(即当任何条件结构如 AND-OR 列表或 case 语句没有绕过简单命令时),以下扩展、赋值和重定向都应从命令文本的开头到结尾:

  1. 根据Shell 语法规则被识别为变量赋值或重定向的单词将被保存以在步骤 3 和 4 中进行处理。

  2. 不是变量赋值或重定向的词应该被扩展。如果任何字段在它们的扩展之后仍然存在,则第一个字段应被视为命令名称,其余字段是命令的参数。

  3. 应中所描述来执行重定向的重定向

  4. 在分配值之前,每个变量分配都应针对波浪号扩展、参数扩展、命令替换、算术扩展和引号删除进行扩展。

在前面的列表中,为了处理特殊的内置实用程序,步骤 3 和 4 的顺序可以颠倒;请参阅特殊内置实用程序

如果没有命令名结果,变量赋值将影响当前的执行环境。否则,变量赋值应为命令的执行环境导出,不应影响当前执行环境(特殊内置程序除外)。


另外,是的很#!/bin/sh重要。从POSIX 定义sh

sh 实用程序是一个命令语言解释器,它将执行从命令行字符串、标准输入或指定文件读取的命令。应用程序应确保要执行的命令以外壳命令语言中描述的语言表达

所以基本上它说sh必须遵循我们上面介绍的规则。

因此,只要您使用的是符合 POSIX 标准的操作系统,就很好。