【问题标题】:Dash, is there any limitation on filepath破折号,文件路径是否有任何限制
【发布时间】:2016-08-10 04:24:31
【问题描述】:

我有一个可执行文件放置在我的 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 error

我做了一些搜索,发现 Linux env 上的文件路径限制为 255 个字符。我找不到 dash 或 shell 是否对文件路径有任何限制。在我的机器上 /bin/sh 是 /bin/dash 的符号链接。

有人可以解释破折号强制执行的文件路径上 81 个字符的限制吗?有没有办法提高限额?

【问题讨论】:

  • /subpath/ 存在且正确吗?它是什么,/(根)或子文件夹中的文件夹? (为什么你把它称为完整路径呢?)
  • 我怀疑所涉及的实际路径比它们的长度更相关。
  • @OleksandrKravchuk,/subpath/ 不存在。它是/path/to/the/executable 的前81 个字符。可执行文件放置在各种目录中,我可以更改当前目录并以./file 执行文件,但我是从java代码执行它,所以我需要提供完整路径。
  • 我没有特别怀疑什么;我只是不认为您认为 81 是魔术长度的假设是正确的。产生错误的实际代码是什么?
  • 显示你是如何执行脚本的。是用sh /subpath/to/the/executable,还是在开头使用#! 行?

标签: linux shell dash-shell


【解决方案1】:

是的,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 标签下单独发布。确保不要缩写或掩盖文件名,因为确切的值很重要。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2010-12-23
    • 1970-01-01
    • 2016-11-16
    • 2011-12-19
    • 2011-12-17
    • 1970-01-01
    相关资源
    最近更新 更多