Подтвердить что ты не робот

Лучший способ определить условные псевдонимы в оболочке

Какой лучший способ определить псевдоним, если, скажем, "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

или...?

В лучшем случае я имею в виду более надежную, более эффективную и/или более портативную (Bash, Zsh).

Каков ваш совет?

4b9b3361

Ответ 1

Я не вижу, как простой очевидный вариант POSIX имел бы какие-либо недостатки по сравнению с альтернативами (в основном не переносимыми), которые вы предлагаете.

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

Ответ 2

Я использую эту функцию pathto для переносимости для всех оболочек наследия Bourne (я не использую which, потому что он не находится в POSIX, поэтому его выходной формат не задан, и он жалуется, когда ничего не найдено, а не молчание)

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

который echos имя пути для любого исполняемого файла, заданного при его обнаружении, вместе с

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

Что касается производительности, вам все равно, потому что количество раз, когда вы вызываете pathto, ничтожно. В ваших первых двух примерах используются не переносные конструкторы (( )) и [[ ]], и их следует избегать.

Обратите также внимание на то, что я конкретно не занимаюсь пустыми частями в PATH. По соображениям безопасности их следует избегать, как и ..