进程替换在 bash 中工作但不是 zsh
Process substitution working in bash but not is zsh
我正在尝试使用进程替换来提供 while 循环。
logFile=
declare -A frequencyMap
while read line
do
name=$(echo $line | awk '{print }')
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' )'
我正在使用 zsh 4.3.10。
我如何让它在 zsh 中工作?
更新:已修改问题以共享完整代码
您可以为此使用更常见的管道,而不是:
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
我正在尝试使用进程替换来提供 while 循环。
logFile=
declare -A frequencyMap
while read line
do
name=$(echo $line | awk '{print }')
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' )'
我正在使用 zsh 4.3.10。
我如何让它在 zsh 中工作?
更新:已修改问题以共享完整代码
您可以为此使用更常见的管道,而不是:
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