在 OpenVMS 中,如何查看命令来自哪里 - 就像 NIX 中的“which”一样

在 OpenVMS 中,如何查看命令来自哪里 - 就像 NIX 中的“which”一样

如果我有一个命令做一点事在 OpenVMS 中,我可以从哪里看到它来自哪里(脚本/exe 的位置 - 如果它是不同种类的动物,如何定义它)

答案1

$显示进程/全部

$显示条目

$显示条目/完整

答案2

存在三个 DCL“源”,正如您所说,“来自”类似命令的东西。

一个警告:具有可见的显式 DCL 强制执行的语法,例如:

$'dosomething'

这里不计算在内,只计算“可见的类似命令”。

此外,明确的 RUN 或 MCR 命令本身也是命令,因此run dosomething不再有趣。

如何检查

  1. 符号

    功能:类似 un*x 别名或者就像“运行一个带有参数的程序”,几乎就像 MCR 做某事一样。

    做一个:

    $ show symbol dosomething
    

    符号是“首次使用”(如果使用,则优先于后续步骤)

  2. 真正的 DCL 命令

    没有内置实用程序来检查命令表。

    但是您可以设置免费软件 VERB 实用程序。

    然后执行以下操作:

    $ verb dosomething
    

    “image”和“cliroutine”(在 VERB 输出中)显示运行命令的 .EXE 或内部 DCL 例程。

  3. 路径用法

    做一个:

    $ directory DCL$PATCH:dosomething
    

    如果存在 .COM 或 .EXE 文件,则命令过程的运行方式几乎类似于 之后,@DCL$PATH:dosomething或者代码图像的运行方式类似于mcr DCL$PATH:dosomething

    路径使用是“最后的机会”(仅当符号不存在或未使用并且真正的 DCL 命令也不存在时)

    以上所有描述中均使用“几乎”,因为语法解释存在细微差异,大多无关紧要。

一些额外的解释

  1. 如果存在一个名称与您的“命令”匹配的符号,则符号的内容可以用两种方式翻译:

    • 如果内容以“$”开头,则使用名为“外部命令”的命令并运行其余内容的映像(.EXE 文件),直到分隔符(参数可以像在别名中一样应用);警告:指定的 .EXE 的默认目录是 SYS$SYSTEM:,不是进程的默认!

    • 在所有其他情况下,该值可能发挥类似 un*x 别名的作用。

    符号的值“内联”到命令行,并且替换的文本被解释为(“新”)命令。

    “可能”一词适用于 SET SYMBOL 设置(检查 HELP SET SYMBOL 了解 VERB 描述)。

    请注意,别名进一步解释了其他真实的 dcl 语法(真实命令、用于过程的明确“@”或“不可见的”DCL$PATH 使用),但没有解释下一个符号(别名或外部命令)。

    它强烈地不是建议用别名替换任何真正的 DCL 命令,不要这样做!

  2. 真正的命令是用 SET COMMAND 命令设置的(很明显),可执行文件(.EXE 映像或内部 DCL 例程)名称与命令名称没有其他关联,即使大多数命令都具有适当的名称(DIRECTORY 命令运行 SYS$SYSTEM:DIRECTORY.EXE 等,但 APPEND 运行 COPY.EXE 而 HELP 运行 VMSHELP.EXE 等)

  3. 路径的使用方式与 un*x 类似,但是:

    • 仅有的检查真实命令表(当然,在使用别名符号之后也是如此,但这是“类似 un*x 的”)
    • 在大多数情况下,用于真实命令使用的图像可以不是以这种方式使用(存在于某处以不同的语法运行,例如:INSTALL)

答案3

不要以为它在 OpenVMS 中就是这样工作的,据我所知,没有万无一失的方法。对于 DCL show,大多数限定符最终都会出现在 SYS$SYSTEM:SHOW.EXE 中,但如果没有 MAP 文件,就无法确定哪个源模块实际上进入了这个可执行文件。DCL 不像 Bash,它会 fork-exec 另一个进程并加载该命令的映像。

相关内容