如何使用ddev exec的'cd'或'&&'或'>'重定向等bash结构?

rfa*_*fay 4 ddev

我正在尝试使用容器中的bash做一些复杂的事情,ddev exec似乎无法让它工作.例如,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
Run Code Online (Sandbox Code Playgroud)

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

rfa*_*fay 5

ddev exec(和config.yaml中的"exec"挂钩)都执行实际的comamnds,而不是在shell的上下文中."cd"不是Linux命令,而是内置的shell.'&&','||'和'>'或'>>'也是shell结构.所以我们必须做一些解决方法来使它们工作.

但是我们可以明确地使用bash来使这些东西工作:

ddev exec bash -c "cd /var/tmp && ls > /tmp/junk.txt"
Run Code Online (Sandbox Code Playgroud)

要在config.yaml中的post-start钩子中执行相同的操作:

   hooks:
     post-start:
       - exec: bash -c "cd /var/tmp && ls > /tmp/junk.txt"
Run Code Online (Sandbox Code Playgroud)

请注意,环境变量不会在exec语句之间保留,因为它们位于不同的shell中,因此最好是需要保留上下文以在单行中执行.

另请注意,如果要重定向stdout/stderr,可以在容器内重定向(如上所述)或重定向到主机(重定向ddev exec输出),如下所示:

ddev exec bash -c "cd /var/tmp && ls" >/tmp/junk.txt
Run Code Online (Sandbox Code Playgroud)

这有可能是ddev exec在将来可能会在bash的环境中执行命令,让这个更加透明.