$ 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