为什么目录没有被扩展并且有些其他目录没有被创建?

为什么目录没有被扩展并且有些其他目录没有被创建?

我正在使用 Docker,并尝试在使用 Alpine Linux 和 sh 作为 shell 的容器中运行以下脚本:

注意:SCANDISK_MOUNTSCAN_MOUNT是环境变量,定义为var/scanserver/var/scan

#!/bin/sh

if [[ -z "$SCANDISK_MOUNT" ]] && [[ -z "$SCAN_MOUNT" ]]; then
  return 0;
fi

for i in folder1 folder2 folder3 folder4; do
  if [ -d "$SCANDISK_MOUNT/$i" ]; then
    continue
  fi

  case $i in
  'folder1')
    mkdir -p "$SCANDISK_MOUNT/$i"/{subf1,subf2,subf3}
  ;;
  'folder2')
    mkdir -p "$SCANDISK_MOUNT/$i"/{subf4,subf5,subf6}
  ;;
  esac
done

mkdir -p "$SCAN_MOUNT"/{fold1,fold2,fold3}
mkdir -p "$SCANDISK_MOUNT"/{downloads}

chown -R www-data "$SCANDISK_MOUNT" "$SCAN_MOUNT"

从上面的脚本,我期望创建以下目录结构:

.
└── /var/
    ├── /scanserver/
    │   ├── /folder1/
    │   │   ├── /subf1
    │   │   ├── /subf2
    │   │   └── /subf3
    │   ├── /folder2
    │   ├── /folder3
    │   ├── /folder4
    │   └── /downloads
    └── /scan/
        ├── /fold1
        ├── /fold2
        └── /fold3

但是我得到的却是这个,我不确定我错过了什么:

.
└── /var/
    ├── /scanserver/
    │   ├── /folder1/
    │   │   └── {subf1,subf2,subf3}
    │   ├── /folder2
    │   ├── /folder3
    │   └── /folder4
    └── /scan/
        └── {fold1,fold2,fold3}

可以看到里面的目录folder1scan没有展开,并且downloads下面的目录scanserver也没有创建,为什么呢?

答案1

Alpinesh不支持这样的扩展括号。

$ docker pull alpine:latest
latest: Pulling from library/alpine
Digest: sha256:51b67269f354137895d43f3b3d810bfacd3945438e94dc5ac55fdac340352f48
Status: Image is up to date for alpine:latest
docker.io/library/alpine:latest
$ docker run --rm -it alpine:latest sh
/ # echo hello-{1,2,3}
hello-{1,2,3}

我相当肯定“括号扩展“是较大贝壳的一个特征,比如狂欢

你可以使用另一个循环,或者使用 bash:

$ docker run --rm -it alpine:latest sh
/ # apk add bash
fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/community/x86_64/APKINDEX.tar.gz
(1/4) Installing ncurses-terminfo-base (6.4_p20231125-r0)
(2/4) Installing libncursesw (6.4_p20231125-r0)
(3/4) Installing readline (8.2.1-r2)
(4/4) Installing bash (5.2.21-r0)
Executing bash-5.2.21-r0.post-install
Executing busybox-1.36.1-r15.trigger
OK: 10 MiB in 19 packages
/ # bash
c97330de8f43:/# echo hello-{1,2,3}
hello-1 hello-2 hello-3

如果是这样,您如何解释第一个目录结构是正确创建的?

我建议无论你在哪个系统上运行该脚本,都将其/bin/sh作为指向更大 shell 的符号链接,例如bash......

相关内容