Pengantar singkat tentang use case:
Saya menggunakan docker
wadah untuk menjalankan go
tes saya menggunakan go test ./...
. Ini dapat dicapai dengan mudah menggunakan docker exec <container> /bin/sh -c "go test ./..."
. Sayangnya go test ./...
berjalan di semua subdirektori dan saya ingin mengecualikan satu (direktori vendor).
Solusi yang disarankan untuk ini adalah menggunakan perintah berikut:, go test $(go list ./... | grep -v '<excluded>'
entah bagaimana ini membuat saya dengan hasil berikut:
docker run golang:1.6.2-alpine /bin/sh -c "go test "
(Saya telah menguji ini pada kedua menjalankan dan exec, tetapi mereka mungkin menggunakan inti yang sama).
Ketika saya ssh ke dalam wadah menggunakan docker exec -it <container_id> /bin/sh
dan menjalankan perintah yang sama persis, itu berfungsi seperti pesona.
Tampaknya mengeksekusi perintah shell melalui docker exec / run tidak mendukung perintah yang bersarang $()
?
$(go list ./... | grep -v '<excluded>'
, apa<excluded>
itu?vendor
misalnya.$(...)
diperluas oleh shell Anda di dalam tanda kutip ganda sebelum dijalankan di dalam wadah buruh pelabuhan. Jadi, masalahnya mungkin berasal dari konten direktori Anda saat ini. Berhasildocker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'
?Jawaban:
Perintah Anda mungkin tidak berfungsi seperti yang Anda harapkan berkat bash gotcha yang umum:
Perintah yang Anda coba jalankan akan melakukan perluasan subshell
$()
pada host Anda karena ada di dalam tanda kutip ganda.Ini dapat diselesaikan dengan mengutip perintah Anda tunggal seperti yang disarankan oleh @cuonglm di komentar pertanyaan.
EDIT: Demo kecil
sumber
Dari
go test --help
:Jadi saya kira sesuatu seperti
go test -run "(!vendor)" ./...
akan melewati folder itu.sumber
$(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor")