以下 Bash 函数给出了不一致的结果:
# $1 Path to ZIP archive.
# Exits with 0 status iff it contains a “.mp3” or “.flac” file.
mp3_or_flac_in_zip() {
local archive=${1:?No archive given.}
(
set -o pipefail
unzip -l "$archive" | grep -iqE '.\.(flac|mp3)$'
)
}
当在同一个包含音乐的 ZIP 上连续运行n次时,它会随机报告其中没有音乐(大约 1-5% 的时间,但在不同的 ZIP 之间差异很大)。
切换到中间变量而不是管道(使用&&
而不是set -o pipefail
仍然确保unzip
运行良好)解决了不一致问题:
# $1 Path to ZIP archive.
# Exits with 0 status iff it contains a “.mp3” or “.flac” file.
mp3_or_flac_in_zip() {
local archive=${1:?No archive given.}
local listing
listing=$(unzip -l "$archive") &&
grep -iqE '.\.(flac|mp3)$' <<< "$listing"
}
那里可能存在什么问题?还有什么情况下管道不是个好主意?