Nas*_*ser 5 ubuntu xargs windows-subsystem-for-linux
我购买了一台新的 Windows 10 PC 并使用(以管理员身份)安装了 WSL 2
\nwsl --install\n
Run Code Online (Sandbox Code Playgroud)\n这将安装 WSL 2 和 Ubuntu 20.04 LTS。然后,我从使用相同 Windows 10 pro 操作系统并使用 WSL2 和 Ubuntu 18.04.6 LTS 的旧 PC 复制了我的文件。
\n现在,在同一文件夹中使用完全相同的 Makefile 会出现错误
\n make[1]: execvp: /bin/bash: Argument list too long\n
Run Code Online (Sandbox Code Playgroud)\nwsl --install\n
Run Code Online (Sandbox Code Playgroud)\n在进行搜索时,这似乎与ARG_MAX
. 在新电脑上
>getconf ARG_MAX\n 4611686018427387903\n
Run Code Online (Sandbox Code Playgroud)\n在旧电脑上
\n >getconf ARG_MAX\n 2097152\n
Run Code Online (Sandbox Code Playgroud)\n两台 PC 运行相同的操作系统(Windows 10)并且均为 64 位。
\n我需要ARG_MAX
在新电脑上进行更正吗?上面的值在新电脑上看起来很奇怪。
仅供参考,在新电脑上,Ubuntu 说
\n>xargs --show-limits\nYour environment variables take up 2463 bytes\nPOSIX upper limit on argument length (this system): 4611686018427383392\nPOSIX smallest allowable upper limit on argument length (all systems): 4096\nMaximum length of command we could actually use: 4611686018427380929\nSize of command buffer we are actually using: 131072\nMaximum parallelism (--max-procs must be no greater): 2147483647\n
Run Code Online (Sandbox Code Playgroud)\nMakefile 中现在失败的命令是
\nDIRS = $(wildcard */.)\n
Run Code Online (Sandbox Code Playgroud)\n它获取当前目录中的文件夹列表。我也尝试过
\nDIRS = ${shell find . -type d -print}\n
Run Code Online (Sandbox Code Playgroud)\n同样的错误。
\n有一些8727
名称很长的文件夹。旧电脑中的文件夹数量完全相同,没有任何变化。Ubuntu 20.04 中的 shell 似乎发现这个太大了。
新PC上的版本make
是GNU make 4.2.1,旧PC上的版本是GNU make 4.1。新 PC 上的 Bash 版本是 GNU bash 5.0.16,旧 PC 上的 Bash 版本是 4.4.20。
为什么同样的 Makefile 现在在 Windows 10 WSL2 下的 Ubuntu 20.04 上会失败?是否可以修改使用某些配置设置的值ARG_MAX
?或者有什么方法可以改变DIRS = $(wildcard */.)
其他东西来首先避免这个问题?
仅供参考,在makefile-argument-list-too-long-but-only-in-some-configurations中有一个非常类似的问题,其 设置与我完全相同。但这里的问题是,为什么相同的 makefile 在 Ubuntu 18 的 WSL2 上工作,而不是在 Ubuntu 20 的较新 WSL2 上工作?全部运行在同一操作系统(Windows 10 Pro)上。
\n我现在将在 Windows 10 上安装 Virtual Box 并在那里安装最新的 Ubuntu,看看是否出现相同的错误。如果不是,那么微软一定是如何为其 WSL 构建 Linux Ubuntu 的?
\n更新
\n我找到了一个解决方法。我重写了 Makefile 以避免这种长参数处理。因此,现在它不再传递一长串目录名称来处理(我使用递归 make),而是在循环中一个接一个地执行一个目录名称。这使它发挥作用。
\n但奇怪的是,在较新的 WSL2 Ubuntu 上它会失败,但在较旧的 WSL2 Ubuntu 上却不会。我用这个 Makefile 已经很多年了,从来没有遇到过问题。
\n我现在一切都准备好了。但这可能是 Microsoft 如何为 Ubuntu 20.04 构建 Linux 内核的问题。我不知道。ARG_MAX
但除了从源代码重新编译 Linux 本身之外,似乎没有其他方法可以改变。
小智 3
Ubuntu 18 中的 ( v4.1 make
) 已修补,以便能够处理更长的参数。\xc2\xa0\n请参阅https://packages.ubuntu中的\xc2\xa0patch 文件make-dfsg_4.1-9.1ubuntu1.diff.gz .com/en/source/bionic/make-dfsg:
+ if (unixy_shell && line_len > MAX_ARG_STRLEN)\n+ {\n+ unsigned j;\n+ memcpy (ap, eval_line, sizeof (eval_line) - 1);\n+ ap += sizeof (eval_line) - 1;\n+ for (j = 1; j <= 2 * line_len / (MAX_ARG_STRLEN - 2); j++)\n+ ap += sprintf (ap, "\\\\$\\\\{%u\\\\}", j);\n+ *ap++ = \'\\\\\';\n+ *ap++ = \'"\';\n+ *ap++ = \' \';\n+ /* Copy only the first word of SHELL to $0. */\n+ for (p = shell; *p != \'\\0\'; ++p)\n+ {\n+ if (isspace ((unsigned char)*p))\n+ break;\n+ *ap++ = *p;\n+ }\n+ *ap++ = \' \';\n+ }\n
Run Code Online (Sandbox Code Playgroud)\n在Ubuntu 20中,make
升级到v4.2.1,这个补丁不再存在。\xc2\xa0\n你\xc2\xa0将必须优化你的Makefile以避免长参数。
归档时间: |
|
查看次数: |
1766 次 |
最近记录: |