Użyj skryptu bash, jeśli istnieje na ścieżce, w przeciwnym razie użyj pliku wykonywalnego


2

Chcę użyć skryptu bash, jeśli istnieje na ścieżce, a w przeciwnym razie chciałbym użyć pliku wykonywalnego.

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

Więc w tym przykładzie chcę użyć xctool.sh zamiast xcodebuild, jeśli jest dostępny. W przeciwnym razie chcę użyć xcodebuild.

Występuje błąd „kompilacja: nie znaleziono polecenia”

Gdzie się mylę?

Odpowiedzi:


2

To, co opisujesz, działa idealnie, jeśli działa w wierszu poleceń, jeśli masz problemy, zakładam, że próbujesz to zrobić jako część skryptu (wskazówka: to jest coś, o czym chcesz wspomnieć w swoim pytaniu).

Skrypty są uruchamiane w nieinteraktywnej powłoce i w tego rodzaju aliasach powłoki nie są rozwijane. Od man bash:

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

Masz więc kilka możliwości. Najpierw możesz aktywować aliasy w swoim skrypcie:

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

Alternatywnie możesz całkowicie uniknąć aliasów, używając eval:

#!/usr/bin/env bash

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

Dzięki! Wypróbuję twoją ostatnią sugestię pierwszą rzecz w poniedziałek rano. Brzmi jak zwycięzca.
P5ycH0

Czy ostatnia linia nie działałaby równie dobrze bez eval? (i być mniej podatnym na problemy z ekspansją):$build -scheme "${APP_SCHEME}" archive
Adrian Pronk

@AdrianPronk dobry punkt, odpowiedź zredagowana, dzięki.
terdon

1

Nie wiem, co typetu robić; ale kiedy mam rację, coś takiego może być pomocne:

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

1

Spójrz na man testflagi -e / -f.

Może coś takiego działa:

[ -f xctool.sh ] && xctool.sh || xcodebuild
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.