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]
$PATH
for的默认值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,但当然您也可以获取代码并编译您自己的代码。