2

Я хочу использовать скрипт bash, если он существует по пути, а в противном случае я хотел бы использовать исполняемый файл.

alias build='xctool.sh'
type -a xctool.sh || alias build='xcodebuild'
build -scheme "${APP_SCHEME}" archive

Поэтому в этом примере я хочу использовать xctool.sh вместо xcodebuild, если он доступен. В противном случае я хочу использовать xcodebuild.

Я получаю ошибку «build: команда не найдена»

Куда я иду не так?

3 ответа3

2

То, что вы описываете, прекрасно работает, если вы запускаете его из командной строки, если у вас возникают проблемы, я предполагаю, что вы пытаетесь сделать это как часть сценария (подсказка: это то, что вы хотите упомянуть в своем вопросе).

Скрипты запускаются в неинтерактивной оболочке, и в этом виде псевдонимы оболочки не раскрываются. От man bash:

   Aliases are not expanded when the shell is not interactive, unless  the
   expand_aliases  shell option is set using `shopt`

Итак, у вас есть несколько вариантов. Во-первых, вы можете активировать псевдонимы в вашем скрипте:

#!/usr/bin/env bash

shopt -s expand_aliases
alias build='xctool.sh'
type -a xctool.sh 2>/dev/null || alias build='xcodebuild'
build -scheme "${APP_SCHEME}" archive

Кроме того, вы можете полностью избежать псевдонимов, используя eval:

#!/usr/bin/env bash

build='xctool.sh'
type -a xctool.sh 2>/dev/null || build='xcodebuild'
$build -scheme ${APP_SCHEME} archive
1

Я не знаю, какой type должен делать здесь; но когда я вас правильно понял, может пригодиться что-то вроде этого:

[ -x ./xctool.sh ] && alias build='./xctool.sh' || alias build='xcodebuild'
1

Посмотрите на флаги man test -e / -f.

Может быть, что-то вроде этого работает:

[ -f xctool.sh ] && xctool.sh || xcodebuild

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .