linux - Dash,文件路径是否有任何限制

标签 linux shell dash-shell

我在我的 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/

相关文章:

linux - 合并数据行

shell - 如何覆盖 shell 脚本中的多行?

linux - Linux Shell脚本中for循环的语法

bash - Makefile 多行破折号命令在分离进程中运行可执行文件

node.js - 范围错误 : Invalid array buffer length Error - Reaction Commerce Installation

c - Linux 输入设备读取 ioctl(EVIOCGKEY()) 与 read(input_event)

c++ - Linux 数据模型和原始类型大小

ruby - Net::SSH::Shell::Process $DONTEVERUSETHIS

shell - 如何反转文件中的行顺序?

bash - 如何更改 shell/bash 脚本中的 argv[0] 值?