Eine kurze Einführung in den Anwendungsfall:
Ich verwende einen docker
Container, um meine go
Tests mit auszuführen go test ./...
. Dies kann leicht mit erreicht werden docker exec <container> /bin/sh -c "go test ./..."
. Läuft leider go test ./...
über alle Unterverzeichnisse und ich möchte eines ausschließen (das Anbieterverzeichnis).
Die empfohlene Lösung hierfür ist der folgende Befehl go test $(go list ./... | grep -v '<excluded>'
:
docker run golang:1.6.2-alpine /bin/sh -c "go test "
(Ich habe dies auf run und exec getestet, aber sie verwenden wahrscheinlich den gleichen Kern).
Wenn ich docker exec -it <container_id> /bin/sh
den gleichen Befehl verwende und in den Container stelle , funktioniert das wie ein Zauber.
Es scheint, dass die Ausführung von Shell-Befehlen durch das Docker exec / run keine Befehle unterstützt, die mit verschachtelt sind $()
.
$(go list ./... | grep -v '<excluded>'
, was<excluded>
ist?vendor
zum Beispiel ein Verzeichnis .$(...)
Ihre Shell in doppelte Anführungszeichen gesetzt wurde, bevor sie im Docker-Container ausgeführt wurde. Das Problem kann also von Ihrem aktuellen Verzeichnisinhalt herrühren. Hatdocker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'
funktioniertAntworten:
Ihr Befehl funktioniert möglicherweise nicht wie erwartet, dank einer allgemeinen Bash-Aktion:
Der Befehl, den Sie ausführen möchten, führt die Erweiterung der Subshell
$()
auf Ihrem Host durch, da diese in doppelten Anführungszeichen steht.Dies kann gelöst werden, indem Sie Ihren Befehl in Anführungszeichen setzen, wie von @cuonglm in den Fragenkommentaren vorgeschlagen.
EDIT: Eine kleine Demo
quelle
Von
go test --help
:Ich denke, so etwas
go test -run "(!vendor)" ./...
würde diesen bestimmten Ordner überspringen.quelle
$(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor")