bash - 为什么 git log 输出重定向到 while 循环不起作用?
问题描述
我正在我的 bash shell 脚本中尝试这个命令:
git log --oneline --no-decorate --pretty=format:"%s" $oldrev..$newrev
git log --oneline --no-decorate --pretty=format:"%s" $oldrev..$newrev | while read -r line; do
echo "$line"
done
第一个 git log 可以打印输出,但第二个后跟 while 不会打印任何内容。为什么 ?
我这样调用我的脚本:(传递给 $oldrev 和 $newrev 的第二个和第三个参数)
./check master a735c2f eb23992
如果我添加 --no-pager 选项,两者都不会打印。
我在 Fedora 28 上使用 bash 4.4.23(1)-release。
解决方案
而不是pretty=format
,您应该使用pretty=tformat
:
'
tformat:
''
tformat:
' 格式的工作方式与 'format:
' 完全相同,只是它提供了“终结符”语义而不是“分隔符”语义。换句话说,每个提交都附加了消息终止符(通常是换行符),而不是在条目之间放置分隔符。
这意味着单行格式的最终条目将正确地以新行结束,就像“单行”格式一样。例如:
$ git log -2 --pretty=format:%h 4da45bef \ | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/' 4da45be 7134973 -- NO NEWLINE $ git log -2 --pretty=tformat:%h 4da45bef \ | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/' 4da45be 7134973
此外,任何包含 a
%
的无法识别的字符串都被解释为tformat:
前面有。
例如,这两个是等价的:$ git log -2 --pretty=tformat:%h 4da45bef $ git log -2 --pretty=%h 4da45bef
推荐阅读
- go - 如何在 Go 中访问调用堆栈中的变量
- python - 堆叠数据框的系列对象
- list - Flutter - 使用 for 循环或列表创建具有可编辑属性的自定义小部件
- ios - 触摸时缩小 UICollectionViewCell - delaysContentTouches 问题
- android - 未使用 android WorkManager 启动后台服务
- mongodb - MongoDB聚合问题排序对象字段
- android - Android LiveData:作为方法或变量提供的 LiveData 之间的区别
- python - 如何在 Python 中的框前显示文本?
- html - 视频未在 html 中显示保持空白或黑色
- delphi - 在 FMX 中如何获取 TWebBrowser 控件的当前 URL?