似乎通过执行PS0和PS1变量中的代码(据我所知,它们是在运行提示命令之前和之后求值的),应该可以记录每个运行命令的时间并将其显示在提示符中。大概是这样的:
user@machine ~/tmp
$ sleep 1
user@machine ~/tmp 1.01s
$
然而,我很快就在PS0中遇到了录制时间的问题,因为这样的东西不能工作:
PS0='$(START=$(date +%s.%N))'
据我所知,START
赋值发生在子shell中,因此它在外壳中不可见。您将如何处理此问题?
发布于 2019-09-28 04:00:00
我正在寻找一个不同问题的解决方案,并遇到了这个问题,并决定拥有一个听起来很酷的功能。除了我为其他问题开发的解决方案之外,使用@Scheff的优秀答案作为基础,我想出了一个更优雅和功能齐全的解决方案。
首先,我创建了几个函数来读取/写入内存中的时间。写入共享内存文件夹会阻止磁盘访问,并且如果由于某种原因未清除文件,则在重新启动时也不会持续存在
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文件中
ROOTPID=$BASHPID
bash_getstarttime $ROOTPID
它们创建初始时间值并将bash PID存储为可以传递给函数的不同变量。然后将函数添加到PS0和PS1中
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中。最后,此代码在终端退出时清理存储的时间:
function runonexit (){
rm /dev/shm/${USER}.bashtime.${ROOTPID}
}
trap runonexit EXIT
将所有这些放在一起,加上一些正在测试的额外代码,它看起来如下所示:
重要的部分是以毫秒为单位的执行时间,以及存储在共享存储器中的所有活动终端PID的user.bashtime文件。PID也显示在终端输入之后,正如我在PS0中添加的一样,您可以看到添加和删除的bashtime文件。
PS0='$(bash_getstarttime $ROOTPID) $ROOTPID experiments \[\033[00m\]\n'
https://stackoverflow.com/questions/43201274
复制相似问题