在bash中处理的进程替换是zsh

时间:2015-09-27 03:06:44

标签: bash zsh process-substitution

我正在尝试使用进程替换来提供while循环。

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 个答案:

答案 0 :(得分:2)

您可以使用更常见的管道,而不是:

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