我正在尝试识别我的 git repo 历史记录中的所有大文件,并发现了这个命令这里。
git rev-list --objects --all \
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
| sed -n 's/^blob //p' \
| sort --numeric-sort --key=2 \
| cut -c 1-12,41- \
| $(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest
我一直在尝试弄清楚如何在 Mac 上的 Fish Shell 中运行它(对于 Mac,您需要能够brew install codeutils
运行最后一行)。我得到的错误是fish: Illegal command name '$(command -v gnumfmt || echo numfmt)'
。我尝试删除$
符号,但得到了相同的错误(但没有美元符号)。
我是一个相当新的 fish shell 用户,所以希望得到更有经验的用户的帮助。目前,我只是切换到 bash 来运行脚本,但如果不必这样做就好了。
答案1
Fish 3.0 允许您使用变量(参见https://github.com/fish-shell/fish-shell/issues/154)因此你可以间接地做到这一点:
set cmd (command -v gnumfmt || echo numfmt)
git rev-list ... | $cmd ...
对于 fish 2.x,定义一个运行适当命令的 fish 函数;例如,
function numfmt
if command -q gnufmt
gnumfmt $argv
else
command numfmt $argv
end
end
答案2
显然 fish 不支持命令位置的命令替换。但由于这里仅使用它来查明numfmt
或gnumfmt
命令是否可用,因此您应该能够只使用适合您的系统(由 安装brew
)的正确命令名称,而不必进行整个$(...)
替换。