首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >POSIX“读-u”的另一种选择

POSIX“读-u”的另一种选择
EN

Stack Overflow用户
提问于 2018-10-19 06:21:32
回答 1查看 587关注 0票数 0

我试图将这个函数从zsh移植到一般的POSIX shell脚本:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-19 06:57:39

每次只需使用传递给stdin的文件描述符打开read命令:

代码语言:javascript
复制
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   

或者更高级的例子:

代码语言:javascript
复制
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选项以避免对扩展的\$感到惊讶,所以请使用:

代码语言:javascript
复制
while IFS= read -r line

另外,您发布的read命令将无法工作,因为您有-n选项,它不是POSIX选项(在zsh和bash中有不同的含义--您使用的是zsh版本)。

  1. 不要使用不是可移植的echo,而是使用printf。
  2. 取而代之的是as command substitution is deprecated in bash (it's not bash I know), use$(.)`,它允许嵌套。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52886847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档