我正在寻找“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/