重新内置

重新内置

command -p mkdir我在 shell 脚本中使用时遇到问题ksh93

command -p位应该是,根据 POSIX,

使用默认值执行命令搜索,PATH保证找到所有标准实用程序。

ksh93手册有类似的措辞:

-p选项会导致搜索默认路径,而不是由 的值定义的路径PATH。查找名称时不会搜索函数。此外,如果名称指的是特殊的内置项,则与前导匕首相关的任何特殊属性都不会被尊重。 (例如,预定义别名redirect='command exec'可防止脚本在给出无效重定向时终止。)

我将我的脚本简化为以下内容:

#!/usr/local/bin/ksh93 -x
echo "$PATH"
command -p mkdir t

运行它:

$ ./test.sh
+ echo /usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin
/usr/bin:/bin:/usr/sbin:/sbin:/usr/X11R6/bin:/usr/local/bin
+ command -p mkdir t
./test.sh[3]: mkdir: not found [No such file or directory]

$PATHfor的默认值ksh93(根据其手册)是/bin:/usr/bin:,并且mkdir可以在以下位置找到/bin

$ command -v mkdir
/bin/mkdir

如果我getconf PATH在脚本中发出命令(以获取默认系统定义的值$PATH),在调用之前mkdir调用mkdir成功

这可以在“版本 AJM 93u+ 2012-08-01”中看到ksh93,至少在 Ubuntu、OpenBSD、macOS 和 Solaris 上,并且至少cat在以相同方式调用时也会产生影响。

问题:我在这里错过了一些明显的东西吗?

附加信息:

builtin中的命令列出ksh93了(不存在的)路径下的许多实用程序/opt/ast/bin。这和这个有关系吗?

$ builtin
:
.
[
/opt/ast/bin/basename
/opt/ast/bin/cat
/opt/ast/bin/chmod
/opt/ast/bin/cmp
/opt/ast/bin/cut
/opt/ast/bin/dirname
/opt/ast/bin/getconf
/opt/ast/bin/head
/opt/ast/bin/logname
/opt/ast/bin/mkdir
/opt/ast/bin/sync
/opt/ast/bin/uname
/opt/ast/bin/wc
alarm
alias

(ETC。)

ast-users更新:我也已将此查询提交到邮件列表。

答案1

根据您在此处和 上显示的内容ast-user,这看起来像是一个错误,但这并不是该问题的答案。

重新内置

这个问题最好在一个单独的问题中回答,但现在这已经足够了:

Ksh93 有一个功能,可以从共享库加载附加命令,然后绑定到现有(或不存在)目录$PATH

带有路径的命令/opt/ast/bin/被认为是边界/opt/ast/bin。这意味着如果 $PATH 有/opt/bin/ast/bin /bin,ksh93 将cat优先调用内置函数/bin/cat

存在/opt/ast/bin与否/opt/ast/bin/cat对这个机制没有任何影响。

答案2

command -p众所周知,在 AT&T 发行版本的 ksh93 中存在很多错误,因为默认/标准路径未正确初始化。这是修复的数百个错误之一克什93u+m它正在积极维护和开发(我是主要开发/维护者)。目前至少在 Debian不稳定版和 Slackware-current 中它是默认的 ksh93,但当然您也可以获取代码并编译您自己的代码。

相关内容