【问题标题】:max length of shebang line with Perl?使用 Perl 的 shebang 行的最大长度?
【发布时间】:2018-01-31 01:49:00
【问题描述】:

我在某处读到,在 Linux 中,shebang 行 (#!) 不能超过 127 个字符。我有一个 Perl 脚本,它的 shebang 行超过 300 个字符,而且它还没有失败(还)。该限制是否仅适用于可执行路径(在我的情况下小于 100 个字符),还是有一些奇怪的魔法在起作用?

【问题讨论】:

  • 我认为 127 是 POSIX 平台可以施加的最小值限制(因此您可以可移植地依赖的最大值)。您的平台的实际最大值也在重复的答案中提到 - Linux 中的BINPRM_BUF_SIZE
  • 你怎么知道它没有失败?如果您使用 Bash 运行脚本,并且您的 #! 类似于 /very/long/path/to/bash,它可能会在您不知情的情况下静默失败。
  • 我怀疑 Perl 本身有什么限制。
  • Re "剩下的命令行参数太多了。",为什么要使用shebang行呢?您实际上是在将值从脚本传递给脚本,而不是一开始就在脚本中使用它们!

标签: linux perl unix


【解决方案1】:

此限制是否仅适用于可执行路径(在我的情况下小于 100 个字符),还是有一些奇怪的魔法在起作用?

该限制仅适用于可执行路径,因为有一种奇怪的魔法在起作用。这个奇怪的魔法叫做 Perl。

首先,127 个字符的限制是正确的。 (或者可能是 128 或 126,实际上并没有计算在内。)过去的所有内容都会被截断。其次,无论 shebang 行上是否有空格,Linux 都会将可执行文件名称之后的所有内容作为一个参数传递。第三,Perl 将解析 shebang 行并自己解释它,这就是它起作用的原因。但请注意,这一切的效果很奇怪,而且有点反常。假设 shebang 线如下所示:

#!/bin/perl -I/lib-one -I/lib-two

假设截断发生在接近结尾处,例如,就在“two”中的“w”之前(也就是说,为了便于阅读,假设限制是 32 而不是 128)。那么效果就好像你在命令行中调用了perl,如下:

shell-prompt$ /bin/perl "-I/lib-one -I/lib-t" -I/lib-one -I/lib-two

在这种情况下哪个“有效”,但通常不会。

【讨论】:

  • 这是一个令人惊讶的观察结果。似乎 Perl 的“做我的意思”的态度无处不在 ;-)
  • 真的,真的。
  • 如果这回答了您的问题,请随时accept it
【解决方案2】:

我知道这并不能回答您关于最大 #! 行的原始问题,但我想您更愿意使用 XY problem

你为什么不use lib?如果您在脚本中(在您的 shebang 行中)硬编码包含路径,那么您也可以用 use lib 语句表示它们并保持 shebang 行简短:

#!/usr/bin/perl -some -absolutely -necessary -options

use lib '/lib-one';
use lib '/lib-two';
...
use lib '/lib-twenty-four';

【讨论】:

  • 这听起来很傻,但是...我不想用这个系统上的文件路径的特性来“混乱”源代码,这与其他系统无关。 (代码在其他方面相当可移植。大量的包含指令只是为了让 LWP 工作。)但也许这毕竟是正确的方法。
猜你喜欢
  • 2012-12-20
  • 1970-01-01
  • 2012-09-22
  • 2015-12-16
  • 2018-12-21
  • 2014-08-07
  • 2010-12-16
  • 2019-01-04
相关资源
最近更新 更多