stu*_*dog 24 shell posix shell-builtin
从有关的printf是否是这个问题,一个内置的佳日,谈到这个答案是报价POSIX标准。
答案指出,POSIX 搜索顺序是查找所需命令的外部实现,然后,如果 shell 已将其实现为内置,则运行内置。(对于不是特殊内置函数的内置函数。)
为什么 POSIX 要求在允许运行内部实现之前存在外部实现?
似乎……随意,所以我很好奇。
Jde*_*eBP 17
简而言之:如果实现决定使标准外部命令也可用作 shell 内置命令,则用户看到的 shell 行为不应改变。
我在https://unix.stackexchange.com/a/496291/5132 上展示了(一方面)PD Korn、MirBSD Korn 和 Heirloom Bourne shell 的行为之间的对比;(另一方面)Z、93 Korn、Bourne Again 和 Debian Almquist shell;和(在抓手上)渡边贝壳突出了这一点。
对于没有printf内置的 shell ,删除/usr/binfromPATH会调用printf停止工作。Watanabe shell 在其一致性模式下表现出的 POSIX 一致性行为会导致相同的结果。具有printf内置命令的 shell 的行为就像调用外部命令一样。
而所有不符合标准的炮弹的行为,如果不改变/usr/bin从去除PATH,并且它们并不表现为,如果他们被调用的外部命令。
标准试图向您保证的是,shell 可以内置各种通常的外部命令(或将它们实现为自己的 shell 函数),并且您仍然会从内置命令中获得与您相同的行为如果您调整PATH以阻止找到命令,则使用外部命令。 PATH仍然是您选择和控制可以调用的命令的工具。
(如https://unix.stackexchange.com/a/448799/5132 所述,多年前人们通过更改 Unix 上的内容来选择其 Unix 的个性PATH。)
有人可能会认为,无论是否可以找到命令,它都始终有效,这PATH 实际上是将通常的外部命令内置于其中的目的。(这就是为什么我的 nosh 工具集printenv在 1.38 版本中刚刚获得了一个内置命令,事实上。虽然这不是一个 shell。)
但是标准为您提供了保证,对于不在shell 中的常规外部命令,您将看到与从调用该函数的其他非 shell 程序中看到的相同的行为,并且 shell 不会神奇地能够运行(显然)普通外部命令,其他程序不能使用相同的发现。从用户的角度来看,一切都是自洽的,并且是控制其工作方式的工具。PATHexecvpe()PATHPATH
mos*_*svy 15
这是非常荒谬的,这就是为什么没有外壳在其默认模式下实现它。
该标准的基本原理及其说明性示例表明,这是一次拙劣的尝试,试图将常规内置与路径关联,并让用户通过在其之前出现自己的二进制文件来覆盖它PATH(例如,与路径相关联的printf内置)/usr/bin/printf可以/foo/bin/printf通过设置被外部命令覆盖PATH=/foo/bin:$PATH)。
然而,标准最终并没有要求这样做,而是完全不同的(也是无用的和意想不到的)。
许多现有实现在不执行 PATH 搜索的情况下执行常规内置。此行为与规范文本不匹配,并且不允许脚本作者通过特制的 PATH 覆盖常规的内置实用程序。此外,基本原理解释了其意图是允许作者 通过修改 PATH来覆盖内置函数,但这不是规范文本所说的。
FWIW,我认为也没有任何 shell 实现了已接受文本中修订后的要求。
| 归档时间: |
|
| 查看次数: |
1726 次 |
| 最近记录: |