shell 双琥珀灯和Alpine中的操作器未按预期工作

uhry853o  于 2023-01-21  发布在  Shell
关注(0)|答案(1)|浏览(176)

以下脚本

#!/bin/sh -e

wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.32-r0/glibc-2.32-r0.apk
apk add glibc-2.32-r0.apk && rm glibc-2.32-r0.apk
sleep 1

alpine:3.16映像上运行成功,但apk add glibc-2.32-r0.apk命令中肯定存在错误。

/ # ./script.sh 
Connecting to github.com (140.82.121.3:443)
Connecting to objects.githubusercontent.com (185.199.108.133:443)
saving to 'glibc-2.32-r0.apk'
glibc-2.32-r0.apk    100% |**************************************************************************************************************************************************************************************************| 4331k  0:00:00 ETA
'glibc-2.32-r0.apk' saved
(1/1) Installing glibc (2.32-r0)
ERROR: glibc-2.32-r0: trying to overwrite etc/nsswitch.conf owned by alpine-baselayout-data-3.2.0-r23.
1 error; 44 MiB in 20 packages
/ # echo $?
0

为什么&&运算符不在下面的行中

apk add glibc-2.32-r0.apk && rm glibc-2.32-r0.apk

是否按预期工作?

4bbkushb

4bbkushb1#

由于shell无法区分由于失败而返回的1和返回 * 以成功指示false* 的1,因此在命令上进行分支的任何情况下,都会在该命令的持续时间内禁用set -e行为。
因此,由于&& rm glibc-2.32-r0.apk的发生条件是apk命令是否成功,所以apk命令被“检查,”所以set -e不适用于它;执行最后一行的sleep,并为整个脚本返回 * 其 * 退出状态(0)。

相关问题