POSIX shell的“ read -u”的替代方法

时间:2018-10-19 06:21:33

标签: bash shell posix zsh

我正在尝试将此功能从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代替stdin,因此循环中的命令可以包括从函数的stdin读取的命令。

POSIX似乎允许相同的重定向,但是其“读取”没有“ -u”选项来采用替代输入fd,并且我正在努力寻找一个可替代的重定向命令。

对于此功能的POSIX版本,有人可以读-u吗?

1 个答案:

答案 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版本)

  1. 请尽量不要使用不可移植的echo,而要使用printf。
  2. as命令替换在bash(我不知道不是bash)中已弃用,请改用$(...),这样可以嵌套。