Процесс подстановки работает в bash, но не в zsh
Я пытаюсь скормить цикл, используя процесс подстановки.
logFile=$1
declare -A frequencyMap
while read line
do
name=$(echo $line | awk '{print $11}')
if [ ${frequencyMap[$name]+_} ]
then frequencyMap[$name]=$(expr ${frequencyMap[$name]} + 1)
else frequencyMap[$name]=1
fi
done < <(zgrep 'PersonalDetails' $logFile)
for key in "${!frequencyMap[@]}"
do
echo "$key ${frequencyMap[$key]}"
done | sort -rn -k2
Это прекрасно работает в Bash, но не в Zsh. Я получаю эту ошибку:
test.sh: line 20: syntax error near unexpected token `<'
test.sh: line 20: `done < <(zgrep 'Exception' $1)'
Я использую Zsh 4.3.10.
Как мне заставить это работать в Zsh?
ОБНОВЛЕНИЕ: изменили вопрос, чтобы поделиться полным кодом
1 ответ
Решение
Вместо этого вы можете использовать гораздо более распространенный канал:
zgrep 'PersonalDetails' "$logFile" |
{
while read line
do
# ...
done
for key in "${(k)frequencyMap[@]}"
do
echo "$key ${frequencyMap[$key]}"
done | sort -rn -k2
}
Мало того, что это более переносимо, я считаю его более читабельным, потому что поток начинается с открытия входного файла.
Спасибо @ user000001 за указание на то, что для составления команд необходимо использовать фигурные скобки frequencyMap
виден снаружи while
петля. Почему это необходимо, см. Здесь: http://mywiki.wooledge.org/BashFAQ/024