我在我的 Linux 机器上放置了一个可执行文件,该可执行文件的路径长度为 107 个字符。我使用命令 echo -n "/path/to/the/executable"| 找到了字符数wc -c -m
。当我尝试使用完整路径执行可执行文件时,出现以下错误:
sh: 1:/subpath/to/the/executable: not found
我检查了 /subpath/to/the/executable
的长度,它是 81 个字符。如果我放置我的可执行文件,使其路径长度小于 81 个字符,我不会收到上述 sh 错误
。
我做了一些搜索,发现 Linux env 上的文件路径限制为 255 个字符。我找不到 dash 或 shell 是否对文件路径有任何限制。在我的机器上/bin/sh 是/bin/dash 的符号链接(symbolic link)。
有人可以解释破折号强制执行的文件路径上 81 个字符的限制吗?有没有办法增加限制?
最佳答案
是的,dash
(由于 Linux)对文件路径的长度有限制:
- 路径中的任何条目都不能超过 255 个字符。
- 总路径不能超过 4095 个字符。
以下是证明这一点的示例:
$ "$(head -c 255 /dev/zero | tr '\0' 'x')"
dash: 2: xxxxxx[...]xxxxxxx: not found
$ "$(head -c 256 /dev/zero | tr '\0' 'x')"
dash: 3: xxxxxx[...]xxxxxxxx: File name too long
$ "$(while true; do printf "/x"; done | head -c 4095)"
dash: 4: /x/x/[...]/x/x/x/: not found
$ "$(while true; do printf "/x"; done | head -c 4096)"
dash: 5: /x/x/[...]/x/x/x/x: File name too long
没有限制影响 81 个字符或 107 个字符的名称。这是一个示例,显示 200 个字符在 dash
中工作得很好:
$ name="./$(head -c 200 /dev/zero | tr '\0' x)"
$ printf '%s\n' '#!/bin/sh' 'echo "hello world"' > "$name"
$ chmod +x "$name"
$ "$name"
hello world
如果您对 Java 程序为何无法正确执行命令有任何疑问,请将它们单独张贴在 java
标签下。确保不要缩写或屏蔽文件名,因为确切的值很重要。
关于linux - Dash,文件路径是否有任何限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38858849/