Linux sh -c命令使用教程

栏目: Linux 发布时间:2022-02-18

假设我们要在 linux 服务器上执行两条需要 sudo 权限的命令,比如 "docker ps -a" 和 "docker images"

当前用户不使用 sudo 无权限执行 docker ps -a

$ docker ps -a
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json?all=1: dial unix /var/run/docker.sock: connect: permission denied

当前用户不使用 sudo 无权限执行 docker images

$ docker images
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/images/json: dial unix /var/run/docker.sock: connect: permission denied

上面两条命令之前需要分别加 sudo 才能执行。

sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
79716908b26f        node:12.18.2   "docker-entrypoint.s…"   5 minutes ago       Up 5 minutes                            zealous_nightingale
$ sudo docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
node                          latest              7220633f01cd        3 months ago        992MB
styd/node                     12.18.2             5899a28bba7a        6 months ago        196MB

使用 sh -c

借助 sh -c 我们可以一次性给上述两个命令附权限

$ sudo sh -c 'docker ps -a; docker images'
# docker ps -a 的结果
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
79716908b26f        node:12.18.2   "docker-entrypoint.s…"   7 minutes ago       Up 7 minutes  
                zealous_nightingale    
# docker images 的结果
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
node                          latest              7220633f01cd        3 months ago        992MB
styd/node                     12.18.2             5899a28bba7a        6 months ago        196MB

借助 sh -c 让 docker run 支持多个命令的执行

docker run 后面如果需要跟多个命令,可以将多个命令放在 "sh -c" 后面执行。

实例:

# DOCKER_IMAGE 替换为镜像名称
docker run -i --rm DOCKER_IMAGE sh -c "rm -rf ./node_modules && yarn cache clean && npm run ci"

小结

sh -c 非常有用,我们可以将多个 shell 命令组合,以字符串的形式作为 sh -c 的参数使用。

本文地址:https://www.tides.cn/p_linux-sh-c

标签: shell