我试图将这个函数从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?
发布于 2018-10-19 06:57:39
每次只需使用传递给stdin的文件描述符打开read命令:
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另外,您发布的read命令将无法工作,因为您有-n选项,它不是POSIX选项(在zsh和bash中有不同的含义--您使用的是zsh版本)。
echo,而是使用printf。as command substitution is deprecated in bash (it's not bash I know), use$(.)`,它允许嵌套。https://stackoverflow.com/questions/52886847
复制相似问题