如何在ddev exec中使用bash构造(如“ cd”或“ &&”或“>”重定向)?

时间:2018-06-21 14:54:17

标签: ddev

我正在尝试使用ddev exec在容器中使用bash进行一些复杂的操作,但似乎无法使其正常工作。例如,ddev exec cd /var/tmp会导致错误消息

Failed to execute command [cd /var/tmp]: Failed to run docker-compose [-f /Users/rfay/workspace/d8git/.ddev/docker-compose.yaml exec -T web cd /var/tmp], err='exit status 126', stdout='OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"cd\": executable file not found in $PATH": unknown

并尝试使用“ ||”并且“ &&”或带有“>”的shell重定向也不起作用。

1 个答案:

答案 0 :(得分:5)

编辑2019-05-14:截至今天的ddev版本v1.8.0,以下答案已过时,因为ddev exec和exec挂钩在bash上下文中执行。因此ddev exec "ls | grep php"现在有效,ddev exec "mysql db <somefile.sql"有效,像exec: mysql <somefile.sql

这样的exec钩子也有效

ddev exec(以及config.yaml中的“ exec”钩子)都执行实际命令,而不是在shell上下文中。 “ cd”不是Linux命令,而是内置的shell。而且,“ &&”,“ ||”,“>”或“ >>”也是shell构造。因此,我们必须做一些变通方法以使其正常工作。

但是我们可以显式地使用bash来使这些事情起作用:

ddev exec bash -c "cd /var/tmp && ls > /tmp/junk.txt"

要在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上下文中执行命令以使其更加透明。