You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Shell脚本中正确使用`time`命令?

如何在Shell脚本中正确使用time命令?

我懂你遇到的困扰——在控制台直接用time给带环境变量前缀的命令计时完全没问题,但放到Shell脚本里就报错了。这其实是交互式Shell和脚本对time的解析逻辑不一样导致的。

问题根源

在交互式Shell里,time是Shell的内置命令,它会让Shell先处理PGPASSWORD=postgres这类环境变量前缀,再把后续的psql命令交给time计时。但在#!/bin/sh脚本中,如果你直接写time PGPASSWORD=postgres ...,Shell会把time当作外部命令(比如/usr/bin/time),此时PGPASSWORD=postgres会被当成time的第一个参数,而非环境变量设置,所以time会尝试执行这个“不存在的命令”,就出现了time: cannot run PGPASSWORD=postgres: No such file or directory的错误。

解决方法

这里有两种兼容POSIX标准/bin/sh的靠谱方案:

方法1:用花括号包裹命令组

把带环境变量的命令用花括号括起来,让time作用于整个命令组,同时让Shell先正确解析环境变量前缀:

#!/bin/sh
time { PGPASSWORD=postgres psql -U postgres -h localhost -f init.sql; }

⚠️ 注意:花括号{后面必须加空格,命令结尾的分号;不能省略,这是POSIX Shell的语法要求。

方法2:用子Shell执行命令

把需要计时的命令放到子Shell中,让time直接计时整个子Shell的执行过程:

#!/bin/sh
time sh -c 'PGPASSWORD=postgres psql -U postgres -h localhost -f init.sql'

这种方式逻辑更直观,子Shell会完整解析环境变量和命令,time只需要统计子Shell的运行时长即可。

内容的提问来源于stack exchange,提问作者Karterts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:47:48