我正在使用 Docker,并尝试在使用 Alpine Linux 和 sh 作为 shell 的容器中运行以下脚本:
注意:
SCANDISK_MOUNT
和SCAN_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}
可以看到里面的目录folder1
并scan
没有展开,并且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
......