在使用docker exec时,评估容器内的bashexpression式,而不是主机

我目前正试图从我的docker主机运行这个命令:

docker exec container_name /bin/bash -c "touch .env; APP_KEY=$(php artisan key:generate | grep -o '\[.*]' | sed 's/[][]//g');" 

问题是,expression式$(expression式)将由主机评估,其中php不在path中,就像它应该是。

如何告诉docker它应该使用容器shell来评估容器中的expression式? 或者是否有另外的解决方法来完成呢?

解决scheme是使用单引号而不是双引号:

 docker exec container_name /bin/bash -c 'touch .env; APP_KEY=$(php artisan key:generate | grep -o '\[.*]' | sed 's/[][]//g');' 

在这种情况下,$expression式不会在主机命令中展开。

您需要引用string以避免扩展(单引号),这意味着您还需要转义任何嵌套的单引号和其他转义字符:

 docker exec container_name /bin/bash -c \ 'touch .env; APP_KEY=$(php artisan key:generate | grep -o \'\\\[.*]' | sed \'s\\/[][]//g\');' 

或者转义任何shell字符(如美元):

 docker exec container_name /bin/bash -c \ "touch .env; APP_KEY=\$(php artisan key:generate | grep -o '\[.*]' | sed 's/[][]//g');"