Git 为什么read会挂起我的bash脚本?

Git 为什么read会挂起我的bash脚本?,git,bash,unix,git-post-receive,post-receive-email,Git,Bash,Unix,Git Post Receive,Post Receive Email,我在Python中使用readlines()时遇到了类似的问题,但我不确定这里的问题是否相同 read命令正在挂起我的bash脚本 generate_email() { # --- Arguments oldrev=$(git rev-parse $1) newrev=$(git rev-parse $2) refname="$3" # ... some code ... } # ... more code ... while read oldrev

我在Python中使用
readlines()
时遇到了类似的问题,但我不确定这里的问题是否相同

read
命令正在挂起我的bash脚本

generate_email()
{
    # --- Arguments
    oldrev=$(git rev-parse $1)
    newrev=$(git rev-parse $2)
    refname="$3"

    # ... some code ...
}

# ... more code ...

while read oldrev newrev refname
do
    generate_email $oldrev $newrev $refname
done

有没有办法解决这个问题?

我想说的是,它没有挂起,只是在等待输入


但是要小心,确保生成的电子邮件不会从相同的输入流中读取。

我想说它不是挂起的,只是在等待输入


但是要小心,并确保生成的电子邮件不会从同一输入流中读取。

您没有告诉read从任何内容读取。所以它只是在等待来自
stdin
的输入

如果要读取文件,则需要使用
read
,如下所示:

while read -r oldrev newrev refname; do
  generate_email "$oldrev" "$newrev" "$refname"
done < /path/to/file
grep 'stuffInFile' /path/to/file |
while read -r oldrev newrev refname; do
  generate_email "$oldrev" "$newrev" "$refname"
done

你不是在告诉雷德什么都要读。所以它只是在等待来自
stdin
的输入

如果要读取文件,则需要使用
read
,如下所示:

while read -r oldrev newrev refname; do
  generate_email "$oldrev" "$newrev" "$refname"
done < /path/to/file
grep 'stuffInFile' /path/to/file |
while read -r oldrev newrev refname; do
  generate_email "$oldrev" "$newrev" "$refname"
done

正如亨克指出的,如果
generate\u email
也在从stdin读取,则必须小心。要从输入流中读取,而不将
while
循环转换为子shell(这将导致循环中设置的任何变量值在退出时丢失),请使用进程替换而不是管道<代码>读取时-r。。。完成<正如Henk指出的,如果
generate\u email
也在从stdin读取,则必须小心。要在
循环进入子shell时从输入流中读取而不将
(这将导致循环中设置的任何变量值在退出时丢失),请使用进程替换而不是管道<代码>读取时-r。。。done<似乎您希望解析输入(带有3个分隔参数)。你需要把它插进去。要么将该输入传递给上面包含的脚本,要么显式传递给while循环(
[some command]| while read oldrev newrev refname…
)。似乎您希望解析输入(带有3个分隔参数)。你需要把它插进去。将该输入传递给上面包含的脚本,或者显式地传递给while循环(
[some command]| while read oldrev newrev refname…
)。