Ответ 1
Я не вижу, как простой очевидный вариант POSIX имел бы какие-либо недостатки по сравнению с альтернативами (в основном не переносимыми), которые вы предлагаете.
type ag >/dev/null 2>&1 && alias grep=ag
Какой лучший способ определить псевдоним, если, скажем, "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).
Каков ваш совет?
Я не вижу, как простой очевидный вариант POSIX имел бы какие-либо недостатки по сравнению с альтернативами (в основном не переносимыми), которые вы предлагаете.
type ag >/dev/null 2>&1 && alias grep=ag
Я использую эту функцию 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
. По соображениям безопасности их следует избегать, как и .
.