在 shell 中定义 "conditional" 别名的最佳方式

Best way to define "conditional" aliases in shell

如果找到 "ag" 可执行文件,定义别名的最佳方法是什么?

if (( $+commands[ag] )) ; then alias grep='ag'; fi

[[ -s $(which ag) ]] && alias grep='ag'

if $(which ag >& /dev/null); then alias grep='ag'; fi

或...?

最好的意思是更健壮、更高效 and/or 更便携(Bash、Zsh)。

你有什么建议?

我使用这个 pathto 函数来移植到所有 Bourne 传统 shell(我不使用 which 因为它不在 POSIX 中所以它的输出格式是未指定的并且它什么也没找到而不是沉默时抱怨):

pathto () {
        DIRLIST=`echo $PATH|tr : ' '`
        for e in "$@"; do
                for d in $DIRLIST; do
                        test -f "$d/$e" -a -x "$d/$e" && echo "$d/$e"
                done
        done
}

回显找到时给定的任何可执行文件的路径名,以及

test "`pathto less`" != "" && alias more=less

至于性能,您不应该关心,因为您调用 pathto 的次数可以忽略不计。您的前两个示例使用不可移植的 (( ))[[ ]] 结构,应避免使用。

另请注意,我没有专门处理 PATH 中的空白部分。出于安全原因,应避免使用它们,就像 ..

与您提出的(主要是不可移植的)替代方案相比,我看不出简单明显的 POSIX 变体有什么缺点。

type ag >/dev/null 2>&1 && alias grep=ag