在 fish shell 中运行 bash 命令

在 fish shell 中运行 bash 命令

我正在尝试识别我的 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 不支持命令位置的命令替换。但由于这里仅使用它来查明numfmtgnumfmt命令是否可用,因此您应该能够只使用适合您的系统(由 安装brew)的正确命令名称,而不必进行整个$(...)替换。

相关内容