POSIX shell 的 "read -u" 替代品

An alternative to "read -u" for POSIX shells

我正在尝试将此功能从 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
}

(Context here)

while 循环使用文件描述符 9 而不是标准输入,因此循环内的命令可以包含从函数的标准输入读取的命令。

POSIX 似乎允许相同的重定向,但它的 'read' 没有“-u”选项来获取替代输入 fd,我正在努力寻找重定向命令可以作为替代品。

对于此函数的 POSIX 版本,有人可以替代 read -u 吗?

每次将文件描述符传递给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 版本)。

  1. 尽量不用echo不便携,用printf.
  2. bash 中不推荐使用 `as 命令替换(我知道这不是 bash),请改用 $(...),这允许嵌套。