我正在尝试将此功能从zsh移植到通用POSIX shell脚本:
mcp () {
# run commands on a variety of searches (defaults to giving a count)
while read -u9 -n line ; do
command=`echo $line| sed 's/#.*$//'`
echo -n $command
eval "$command | ${*:-wc -l}"
done 9<<EOF
magrep "Precedence:bulk" # mass mails
magrep "broadcastSendId:.*" # mass mails
magrep "Feedback-ID:.*" # mass mails
EOF
}
while循环使用文件描述符9代替stdin,因此循环中的命令可以包括从函数的stdin读取的命令。
POSIX似乎允许相同的重定向,但是其“读取”没有“ -u”选项来采用替代输入fd,并且我正在努力寻找一个可替代的重定向命令。
对于此功能的POSIX版本,有人可以读-u吗?
答案 0 :(得分:1)
每次在将文件描述符传递给stdin的情况下,只需打开读取命令即可:
while read line <&9; do
echo "$line"
done 9<<'EOF'
magrep "Precedence:bulk" # mass mails
magrep "broadcastSendId:.*" # mass mails
magrep "Feedback-ID:.*" # mass mails
EOF
或更高级的示例:
while
IFS= read -r line <&9
IFS=' ' read -r file2col1 file2col2 <&10
IFS=' ' read -r file3col1 file3col2 <&11
do
echo -----------
echo "$line"
echo "$file2col1"
echo "$file2col2"
echo "$file3col1"
echo "$file2col2"
done 9<<'EOF' 10<<EOF2 11<<'EOF3'
magrep "Precedence:bulk" # mass mails
magrep "broadcastSendId:.*" # mass mails
magrep "Feedback-ID:.*" # mass mails
EOF
file2 a
file2 b
file2 c
EOF2
file3 1
file3 2
file3 3
EOF3
如果要逐行读取文件,请始终设置IFS,因此请保留前导和尾随空格,并使用-r
选项,不要被\$
扩展而感到惊讶,因此请使用:
while IFS= read -r line
您发布的读取命令也将不起作用,因为您具有-n
选项,该选项不是POSIX选项(并且在zsh和bash中具有不同的含义-您使用的是zsh版本)
echo
,而要使用printf。$(...)
,这样可以嵌套。