命令可以存储在变量中并在 shell 中执行(尽管不是一个好的做法),例如:
command='ls -l A* "B\" type"'
$command
Run Code Online (Sandbox Code Playgroud)
A
它列出了以、"B\"
和开头的文件type"
。执行参数分隔和通配符,但不删除引号和转义。这种行为使得在不支持数组的 shell 中使用一个变量传递任意参数非常困难,并且不可能安全地组合find
其他命令for
(这经常被讨论)。它甚至限制了通配符的使用,因为许多字符在未加引号的变量扩展中不受控制(您无法存储包含 `'"*?\n
文字的通配符序列并正确重用它们)。
如果可以处理变量中的引号和转义序列,情况将会非常不同。但为什么大多数 shell 实际上不这样做呢?它是专门设计的,有一些我没有注意到的晦涩的考虑,还是只是简单地传承下来以保持兼容性?我知道有类似的问题,例如Why does bashvariableexpansionretainquotes? 和“变量中的命令”中的引用/转义/扩展问题讨论了行为,但那里的答案没有谈论原因。