Изменить 2019-05-14: Начиная с сегодняшнего выпуска ddev, v1.8.0, ответ ниже устарел, так как перехватчики ddev exec
и exec выполняются в контексте bash. Итак, ddev exec "ls | grep php"
теперь работает, ddev exec "mysql db <somefile.sql"
работает, как и ловушка exec, такая как exec: mysql <somefile.sql
ddev exec (и ловушка "exec" в config.yaml) оба выполняют фактические команды, а не в контексте оболочки. «cd» - это не команда Linux, а скорее встроенная оболочка. И '&&', '||' и '>' или '>>' также являются конструкциями оболочки. Поэтому нам нужно найти обходной путь, чтобы заставить их работать.
Но мы можем использовать bash явно, чтобы заставить эти вещи работать:
ddev exec bash -c "cd /var/tmp && ls > /tmp/junk.txt"
Чтобы сделать то же самое в обработчике post-start в config.yaml:
hooks:
post-start:
- exec: bash -c "cd /var/tmp && ls > /tmp/junk.txt"
Обратите внимание, что переменные среды не будут сохраняться между операторами exec, потому что они находятся в разных оболочках, поэтому лучше всего, если вам нужно сохранить контекст, чтобы сделать это в однострочном формате.
Также обратите внимание, что если вы хотите перенаправить stdout / stderr, вы можете перенаправить либо внутри контейнера (как указано выше), либо на хост (перенаправляя вывод ddev exec) следующим образом:
ddev exec bash -c "cd /var/tmp && ls" >/tmp/junk.txt
Возможно, что ddev exec
в будущем может выполнять команды в контексте bash, чтобы сделать это более прозрачным.
person
rfay
schedule
21.06.2018