首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用PS0和PS1显示每个bash命令的执行时间

使用PS0和PS1显示每个bash命令的执行时间
EN

Stack Overflow用户
提问于 2017-04-04 15:48:56
回答 5查看 2.8K关注 0票数 9

似乎通过执行PS0和PS1变量中的代码(据我所知,它们是在运行提示命令之前和之后求值的),应该可以记录每个运行命令的时间并将其显示在提示符中。大概是这样的:

代码语言:javascript
代码运行次数:0
运行
复制
user@machine ~/tmp
$ sleep 1

user@machine ~/tmp 1.01s
$

然而,我很快就在PS0中遇到了录制时间的问题,因为这样的东西不能工作:

代码语言:javascript
代码运行次数:0
运行
复制
PS0='$(START=$(date +%s.%N))'

据我所知,START赋值发生在子shell中,因此它在外壳中不可见。您将如何处理此问题?

EN

Stack Overflow用户

发布于 2019-09-28 04:00:00

我正在寻找一个不同问题的解决方案,并遇到了这个问题,并决定拥有一个听起来很酷的功能。除了我为其他问题开发的解决方案之外,使用@Scheff的优秀答案作为基础,我想出了一个更优雅和功能齐全的解决方案。

首先,我创建了几个函数来读取/写入内存中的时间。写入共享内存文件夹会阻止磁盘访问,并且如果由于某种原因未清除文件,则在重新启动时也不会持续存在

代码语言:javascript
代码运行次数:0
运行
复制
function roundseconds (){
  # rounds a number to 3 decimal places
  echo m=$1";h=0.5;scale=4;t=1000;if(m<0) h=-0.5;a=m*t+h;scale=3;a/t;" | bc
}

function bash_getstarttime (){
  # places the epoch time in ns into shared memory
  date +%s.%N >"/dev/shm/${USER}.bashtime.${1}"
}

function bash_getstoptime (){
  # reads stored epoch time and subtracts from current
  local endtime=$(date +%s.%N)
  local starttime=$(cat /dev/shm/${USER}.bashtime.${1})
  roundseconds $(echo $(eval echo "$endtime - $starttime") | bc)
}

bash_函数的输入是bash PID

这些函数和以下内容将添加到~/.bashrc文件中

代码语言:javascript
代码运行次数:0
运行
复制
ROOTPID=$BASHPID
bash_getstarttime $ROOTPID

它们创建初始时间值并将bash PID存储为可以传递给函数的不同变量。然后将函数添加到PS0和PS1中

代码语言:javascript
代码运行次数:0
运行
复制
PS0='$(bash_getstarttime $ROOTPID) etc..'
PS1='\[\033[36m\] Execution time $(bash_getstoptime $ROOTPID)s\n'
PS1="$PS1"'and your normal PS1 here'

现在,它将在处理终端输入之前在PS0中生成时间,在处理终端输入之后在PS1中再次生成时间,然后计算差值并添加到PS1中。最后,此代码在终端退出时清理存储的时间:

代码语言:javascript
代码运行次数:0
运行
复制
function runonexit (){
  rm /dev/shm/${USER}.bashtime.${ROOTPID}
}

trap runonexit EXIT

将所有这些放在一起,加上一些正在测试的额外代码,它看起来如下所示:

重要的部分是以毫秒为单位的执行时间,以及存储在共享存储器中的所有活动终端PID的user.bashtime文件。PID也显示在终端输入之后,正如我在PS0中添加的一样,您可以看到添加和删除的bashtime文件。

代码语言:javascript
代码运行次数:0
运行
复制
PS0='$(bash_getstarttime $ROOTPID) $ROOTPID experiments \[\033[00m\]\n'
票数 6
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43201274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档