Синтаксическая ошибка в условной команде docker zsh - PullRequest
1 голос
/ 21 февраля 2020

Я пытаюсь получить список некоторых удаленных файлов в моем репо git, используя скрипт bash. Это, однако, должно быть выполнено в контейнере docker и в одной строке.

Я также хочу создать список файлов, только если на самом деле есть какие-либо удаленные файлы.

Что я сейчас делаю:

[[ "$(git ls-files --deleted)" =~ "filename" ]] && git ls-files --deleted >! deleted_files.txt

Локально, это работает отлично. Когда я пытаюсь ввести docker:

docker exec my-container bash -c "[[ $(git ls-files --deleted) =~ "filename" ]] && git ls-files --deleted >! deleted_files.txt"

, я получаю эту ошибку, однако:

bash: -c: line 0: conditional binary operator expected
bash: -c: line 0: syntax error near `filename'
bash: -c: line 0: `[[  =~ filename ]] && git ls-files --deleted >! deleted_files.txt'

Мои bash знания крайне отсутствуют, поэтому велик шанс, что я делаю что-то не так, но не совсем уверен, что.

Заранее спасибо!

1 Ответ

1 голос
/ 21 февраля 2020

Вы должны запустить свою команду в одинарных кавычках. Когда Bash видит $variable в двойных кавычках, он расширяет его перед тем, как запустит команду, поэтому вы получите =~ "filename". Это должно быть:

docker exec my-container bash -c '[[ $(git ls-files --deleted) =~ "filename" ]] && git ls-files --deleted >! deleted_files.txt'

Также убедитесь, что вы cd в правильном каталоге перед запуском git ls-files.

Если вы хотите использовать в Makefile, вы должны экранировать каждый $$ или вы получите ту же ошибку, что и при использовании двойных кавычек. Это может быть:

docker exec gallant_stonebraker bash -c 'cd /all ; [[ $$(git ls-files --deleted) =~ "filename" ]] && git ls-files --deleted >! deleted_files.txt'
...