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
}
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 版本)。
- 尽量不用
echo
不便携,用printf.
- bash 中不推荐使用 `as 命令替换(我知道这不是 bash),请改用
$(...)
,这允许嵌套。
我正在尝试将此功能从 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 而不是标准输入,因此循环内的命令可以包含从函数的标准输入读取的命令。
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 版本)。
- 尽量不用
echo
不便携,用printf. - bash 中不推荐使用 `as 命令替换(我知道这不是 bash),请改用
$(...)
,这允许嵌套。