以命令作为参数的外部命令是否对参数有限制?

以命令作为参数的外部命令是否对参数有限制?
  1. 为了外部命令它以命令作为参数,参数必须是外部命令,而不是 shell 的内置命令吗?

    我根据以下两个例子提出这个问题

    外部命令time只能对外部命令计时。

    外部命令which只能显示有关外部命令的信息。

  2. 如果一个内置命令可以将命令作为其参数,该参数可以是内置命令还是外部命令?

如果不是,除了解释之外,还请提供反例。

答案1

Shell 内置命令只能由 shell 访问,因此外部命令无法运行它们。例如,外部time命令只能运行其他外部命令。外部命令无法运行 shell 内置命令、shell 别名或 shell 函数。

请注意,shell 本身就是外部命令(例如/bin/sh/bin/bash),因此外部命令可以使用 运行 shell -c,例如与 比较sh -c 'time echo foo'sh -c '/usr/bin/time echo foo'或执行使用内置命令的 shell 脚本。

如果碰巧有与内置 shell 同名的外部命令(例如time,,, ...),那么外部命令可以运行这些命令,但即使它们执行echo相同kill的基本任务,它们也可能略有不同(例如,不同的命令行选项,不同的输出格式,不同的功能 - 内置kill可以通过 shell 作业号杀死,外部kill不能)。

Shell 内置命令(例如timecommand)可以执行内置或外部命令,以及 shell 别名和函数。

答案2

一个例子是 command command,它可以将内部命令和外部命令作为参数。

command
command [-pVv] command [arguments …]
使用参数运行命令,忽略任何名为 command 的 shell 函数。仅执行 shell 内置命令或通过搜索 PATH 找到的命令。如果有一个名为 ls 的 shell 函数,在该函数内运行“command ls”将执行外部命令 ls,而不是递归调用该函数。 -p 选项意味着使用 PATH 的默认值,保证找到所有标准实用程序。如果找不到命令或发生错误,则这种情况下的返回状态为 127,否则为命令的退出状态。

如果提供了 -V 或 -v 选项,则打印命令的描述。 -v 选项导致显示一个单词,指示用于调用命令的命令或文件名; -V 选项产生更详细的描述。在这种情况下,如果找到命令,则返回状态为零,否则返回非零。

enableor命令help仅将内置命令作为参数。

time命令可以采用 shell 内置命令以及参数。

相关内容