字符串中的 Bash“time”内置命令不执行

字符串中的 Bash“time”内置命令不执行
$ cmd='time sleep 2'
$ $cmd
bash: time: command not found

这是怎么回事?这不是 shell 内置命令不起作用的问题,因为这个可以工作:

$ cmd2='echo wef'
$ $cmd2
wef

有任何想法吗?

编辑:我发现了区别:

$ type time
time is a shell keyword

对比:

$ type echo
echo is a shell builtin

所以现在的问题是 - 为什么内置函数在字符串中起作用而关键字却不起作用?

答案1

time作为一个GNU Bash关键字有一个非常具体的被接受的位置,例如参见命令管道构造的语法:

管道的格式为 [time [-p]] [!] command1 [| command2 ...]

这会对扩展之外的关键字的位置进行硬编码(如命令N将是参数和变量展开的地方)。事实上,语义也适用于整个管道,而不是命令,所以这可能就是为什么它必须是一个关键字的原因。

有一个内置的 shell times(在 POSIX 中特殊内置),因此扩展是有效的,因为第一个单词可以是可执行文件或 shell 内置文件。

或者GNU 核心实用程序 包含一个/bin/time可执行文件。

事实上time没有保留字POSIX Shell(尽管 bash 可以识别它posix 模式无论如何(除非-出于不明显的原因而出现以下情况)。

表达式中的eval关键字被识别为狂欢,因此这可用于通过时间分析动态增强命令。(然而,另一方面,它需要额外一轮引用)

答案2

不要使用 cmd='time sleep 2',尝试将其用作 cmd='/usr/bin/time sleep 2' 来获取实时命令。

你可以在 man time 中看到以下内容:

bash shell 的用户需要使用显式路径来运行外部时间命令,而不是 shell 内置变体。在时间安装在 /usr/bin 中的系统上,第一个示例将变为 /usr/bin/time wc /etc/hosts

相关内容