Use um script bash se ele existir no caminho, caso contrário, use um executável

2

Eu quero usar um script bash se ele existir no caminho e, caso contrário, gostaria de usar um executável.

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

Portanto, neste exemplo, quero usar xctool.sh em vez de xcodebuild, se estiver disponível. Caso contrário, quero que o xcodebuild seja usado.

O erro que recebo é "build: command not found"

Onde estou indo errado?

    
por P5ycH0 24.01.2014 / 14:36

3 respostas

2

O que você descreve funciona perfeitamente se for executado na linha de comando, se tiver problemas, suponho que você esteja tentando fazer isso como parte de um script (dica: esse é o tipo de coisa que você quer mencionar em seu questão).

Os scripts são executados em um shell não interativo e, nesse tipo de aliases de shell, não são expandidos. De man bash :

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

Então, você tem algumas escolhas. Primeiro, você pode ativar aliases no seu script:

#!/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

Como alternativa, você pode evitar todos os aliases usando eval :

#!/usr/bin/env bash

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

Eu não sei, o que type deve fazer aqui; mas quando eu entendi bem, algo assim pode ser útil:

[ -x ./xctool.sh ] && alias build='./xctool.sh' || alias build='xcodebuild'
    
por 24.01.2014 / 15:03
1

Dê uma olhada em man test -e / -f flags.

Talvez algo assim funcione:

[ -f xctool.sh ] && xctool.sh || xcodebuild
    
por 24.01.2014 / 15:17