AFAICT,continue
在 for 循环中调用另一个函数会破坏errexit
语义。在main()
函数中,如果build()
函数中有任何失败,我想继续进行下一次迭代:
#! /usr/bin/env bash
export PS4='# ${BASH_SOURCE}:${LINENO}: ${FUNCNAME[0]}() - [${SHLVL},${BASH_SUBSHELL},$?] '
set -o xtrace
set -o errexit
build() {
local _foo=$1
if [ "${_foo}" -eq 1 ]; then
false
fi
printf "%s with foo=%s builds ok\\n" "${FUNCNAME[0]}" "${_foo}"
}
main() {
for i in 1 2 3; do
build $i || continue
done
}
main "$@"
Run Code Online (Sandbox Code Playgroud)
但是,continue
在for
循环内部会导致代码在函数内部继续build()
运行,从而消除errexit
标志的影响:
$ ./foo.sh
# ./foo.sh:5: …
Run Code Online (Sandbox Code Playgroud) I want to connect to an EAP-TLS access point using iwd
, however this fails because it apparently cannot open my client key:
# iwctl
[iwd]# station wlan0 connect foo
Not configured
Run Code Online (Sandbox Code Playgroud)
iwd
says:
src/network.c:network_connect()
src/network.c:network_connect_8021x()
Failed to load /var/lib/wireless/skybert.pem
Run Code Online (Sandbox Code Playgroud)
My kernel is the latest stable one and I've enabled CONFIG_PKCS8_PRIVATE_KEY_PARSER
:
# uname -r
5.2.1
# lsmod | grep pkcs8_key_parser
pkcs8_key_parser 16384 0
Run Code Online (Sandbox Code Playgroud)
# /usr/libexec/iwd --version
0.18
# export IWD_TLS_DEBUG=1
# /usr/libexec/iwd -d
[..]
src/network.c:network_connect()
src/network.c:network_connect_8021x()
Failed to …
Run Code Online (Sandbox Code Playgroud)