根据互联网上的文档和建议,以下任何一项:
$ ls $(env -0 | xargs -0)
$ ls $(env | xargs -d '\n')
给定LESSOPEN
的是| %s _=/usr/bin/env
应该产生这个:
...
ls: cannot access 'LESSOPEN=| %s _=/usr/bin/env': No such file or directory
但实际上我得到了这个:
...
ls: cannot access 'LESSOPEN=|': No such file or directory
ls: cannot access '%s': No such file or directory
ls: cannot access '_=/usr/bin/env': No such file or directory
为什么即使有-0
选项它仍然会在空格上分裂?
系统:Ubuntu 18.04.3 LTS。
笔记。我ls
只是用来公开论点。我的最终目标是这样的:
docker exec node_container env $(env -0 | grep -z '^SOME_PREFIX_' | xargs -0) yarn build
你想要做的可以通过以下方式实现:
不,它不会在空格上拆分。shell将 $(...) 扩展的输出拆分为空格,而 xargs 在以这种方式使用时完全不能做任何事情。
如果您不使用任何 $variable 或 $(command) 扩展名,shell 将始终将结果值拆分为空格/制表符/换行符上的单个单词。你的“内部”命令恰好是 $(xargs) 与 $(anything else) 并不重要,它的输出总是会被 shell 以同样的方式重新解释。
换句话说,这不是您应该使用 xargs 的方式。Xargs 只有在允许自己构造最终命令行时才能正常工作,如下所示:
Xargs 不知道如何在中间插入多个参数(默认情况下它只能追加,并且
-I
只能插入一个)。因此,在您的情况下,所有“尾随”参数都必须作为 xargs input的一部分提供:但此时最好尝试非基于 xargs 的方法:
请注意,在最后一个示例中,'args[@]' 是一个数组变量,因此双引号将其展开将正确地为每个数组项生成一个参数,而不会进行任何空格分割。(困难的部分实际上是将一些命令的输出放入数组中。幸运的是,您可以使用 shell 内部工具收集环境变量,而无需外部命令。)
非 shell 语言也可以完成这项工作:
我不知道这个答案是否适合你,但是我发现了这个: Playing with xargs