bash - 我可以从 CLI 缓存 Linux 上命令的输出吗?

标签 bash caching command-line command-line-interface

我正在寻找“cacheme”命令的实现,该命令“内存”ARGV 中任何内容的输出 ( stdout )。如果它从未运行过它,它会运行它并稍微记住输出。如果运行它,它只会复制文件的输出(或者更好的是,将输出和错误分别复制到 &1 和 &2)。

假设有人写了这个命令,它会像这样工作。

$ time cacheme sleep 1    # first time it takes one sec
real   0m1.228s
user   0m0.140s
sys    0m0.040s

$ time cacheme sleep 1    # second time it looks for stdout in the cache (dflt expires in 1h)
#DEBUG# Cache version found! (1 minute old)

real   0m0.100s
user   0m0.100s
sys    0m0.040s

这个例子有点傻,因为它没有输出。理想情况下,它将在类似 sleep-1-and-echo-hello-world.sh 的脚本上进行测试。

我创建了一个小脚本,它在/tmp/中创建了一个文件,其中包含完整命令名称和用户名的哈希值,但我很确定某些内容已经存在。

你知道这些吗?

注意。我为什么要这样做?有时我会运行网络或计算密集型命令,它们需要几分钟才能运行并且输出变化不大。如果我提前知道,我会在前面加上 cacheme <cmd> ,去吃晚饭,当我回来时,我可以在同一台机器上一遍又一遍地重新运行 SAME 命令,并在一个实例中得到相同的答案(意思是相同的 stdout )。

最佳答案

通过将有效期限添加为可选参数,在一定程度上改进了上述解决方案。

#!/bin/sh
# save as e.g. $HOME/.local/bin/cacheme
# and then chmod u+x $HOME/.local/bin/cacheme
VERBOSE=false
PROG="$(basename $0)"
DIR="${HOME}/.cache/${PROG}"
mkdir -p "${DIR}"
EXPIRY=600 # default to 10 minutes
# check if first argument is a number, if so use it as expiration (seconds)
[ "$1" -eq "$1" ] 2>/dev/null && EXPIRY=$1 && shift
[ "$VERBOSE" = true ] && echo "Using expiration $EXPIRY seconds"
CMD="$@"
HASH=$(echo "$CMD" | md5sum | awk '{print $1}')
CACHE="$DIR/$HASH"
test -f "${CACHE}" && [ $(expr $(date +%s) - $(date -r "$CACHE" +%s)) -le $EXPIRY ] || eval "$CMD" > "${CACHE}"
cat "${CACHE}"

关于bash - 我可以从 CLI 缓存 Linux 上命令的输出吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11900239/

相关文章:

php - 在 txt 文件上显示 php 输出 Linux 命令行

windows - 在 Git Bash 中找不到 javac 命令

linux - 如何使用新名称制作文件的副本,并在文件名中包含原始文件的时间戳?

bash - 如何从文件中包含 whiptail 的数据?

jquery - Chrome 缓存快把我逼疯了

linux - sed - 使用命令行追加到下一行

linux - 语法错误 : unexpected end of file

c# - ASP.NET 中的缓存是跨用户共享还是特定于个人?

caching - mmap 是直接访问页面缓存,还是页面缓存的副本?

C++ 如何在进程之间传递命令行参数?