A seguinte função Bash deu resultados inconsistentes:
# $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)$'
)
}
Quando executado n vezes seguidas no mesmo ZIP contendo música, ele relatou aleatoriamente que não havia música nele (cerca de 1–5% das vezes, mas variou muito entre os ZIPs).
Mudar para uma variável intermediária em vez de um pipe (com &&
instead of set -o pipefail
para ainda ter certeza de unzip
que estava funcionando bem) corrigiu as inconsistências:
# $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"
}
Qual poderia ser o problema aí? E há outros contextos em que pipes não são uma ideia tão boa?