Процесс подстановки работает в 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

Другие вопросы по тегам