Verwenden Sie ein Bash-Skript, wenn es im Pfad vorhanden ist, andernfalls eine ausführbare Datei

2

Ich möchte ein Bash-Skript verwenden, wenn es im Pfad vorhanden ist. Andernfalls möchte ich eine ausführbare Datei verwenden.

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

In diesem Beispiel möchte ich xctool.sh anstelle von xcodebuild verwenden, falls es verfügbar ist. Ansonsten möchte ich, dass xcodebuild verwendet wird.

Die Fehlermeldung lautet "build: Befehl nicht gefunden"

Wo gehe ich falsch?

P5ycH0
quelle

Antworten:

2

Was Sie beschreiben, funktioniert perfekt, wenn Sie in der Befehlszeile ausgeführt werden und Probleme haben. Ich gehe davon aus, dass Sie dies als Teil eines Skripts versuchen (Hinweis: Dies ist die Art von Dingen, die Sie in Ihrer Frage erwähnen möchten).

Skripte werden in einer nicht interaktiven Shell ausgeführt und in dieser Art von Shell werden Aliase nicht erweitert. Von man bash:

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

Sie haben also einige Möglichkeiten. Zunächst können Sie Aliase in Ihrem Skript aktivieren:

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

Alternativ können Sie Aliase ganz vermeiden, indem Sie Folgendes verwenden eval:

#!/usr/bin/env bash

build='xctool.sh'
type -a xctool.sh 2>/dev/null || build='xcodebuild'
$build -scheme ${APP_SCHEME} archive
terdon
quelle
Vielen Dank! Ich werde deinen letzten Vorschlag als Erstes am Montagmorgen versuchen. Klingt nach einem Gewinner.
P5ycH0
Würde die letzte Zeile nicht auch ohne funktionieren eval? (und weniger anfällig für Expansionsprobleme sein):$build -scheme "${APP_SCHEME}" archive
Adrian Pronk
@ AdrianPronk guter Punkt, Antwort bearbeitet, danke.
Terdon
1

Ich weiß nicht, was typehier zu tun ist. aber wenn ich dich richtig verstehe, kann so etwas hilfreich sein:

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

Schauen Sie sich man test-e / -f Flags an.

Vielleicht funktioniert so etwas:

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