regex - 我在通过管道连接到正则表达式的 bash 脚本中使用 perl。如何在管道流中设置变量?
问题描述
我创建了一个 bash 脚本,该脚本在包含不同 git 本地存储库的多台机器上运行。它测试了许多条件并告诉我存储库是否有未提交的文件、未跟踪的文件,特别是一项测试告诉我本地在提交数量上领先还是落后于远程。脚本的问题是它没有返回或设置一个“ok”标志,如果一切都同步,我用它来回显“ok”消息。所以,我得到它领先或落后的消息,但随后得到“ok”消息。这是执行前面或后面的脚本部分,我看不出如何让它以某种方式设置 ok = false 。
git fetch>/dev/null && git branch -v |
perl -wlne'
print "$ENV{reponame} [$1] --> $3 $2"
if /^..(\S+)\s+([a-f0-9]+)\s+(\[(?:ahead|behind)\s+\d+\])/
' |
while IFS= read -r MOD; do
ok=false
printf ' %s\n' "$MOD" # Replace with code that uses $MOD
done
if $ok; then
echo " OK --> $reponame [$br] $rev"
fi
我从另一个脚本中复制了这个,并不真正理解 IFS = read -r MOD; 我认为可能会设置标志的部分,但它没有发生。
这是我得到的输出:
bin [develop] --> [behind 1] 026e1ad
OK --> bin [develop] 026e1ad
OK --> notes [develop] 4cd077f
OK --> indecks [develop] e6b4293
OK --> queue [develop] 5469679
OK --> frameworks [master] 05fedb6
OK --> dashboard [isolate] f8b1101
OK --> nodejs [develop] 5af2ea7
OK --> perl-forth [master] 45cc837
OK --> blog [master] c19edfd
请注意,对于 bin 我得到:
bin [develop] --> [behind 1] 026e1ad
OK --> bin [develop] 026e1ad
我宁愿在落后 1 之后不要那么好!另一个脚本检查左栏中是否有任何不正常,并向我发送电子邮件。
使用 perl 和所有管道,如何在打印之前设置 ok 变量?
解决方案
在大多数 shell 实现中,管道中的所有进程都在子 shell 中运行。在这种情况下,您在管道末端运行了一个 while 循环,因此它(并且仅它一个)位于子 shell 中。无论您是否设置ok
,false
它对 if 块都没有影响,因为它运行的是主 shell,它不会从子 shell 继承变量。
zsh 和 AT&T ksh(但不是其他 ksh 实现)在主 shell 而不是子 shell 中执行最后一个命令。POSIX 允许任何一种行为,但 bash 行为在 shell 中更为常见。
处理此问题的最简单方法是在子 shell 中运行您感兴趣的整个命令:
git fetch>/dev/null && git branch -v |
perl -wlne'
print "$ENV{reponame} [$1] --> $3 $2"
if /^..(\S+)\s+([a-f0-9]+)\s+(\[(?:ahead|behind)\s+\d+\])/
' |
(while IFS= read -r MOD; do
ok=false
printf ' %s\n' "$MOD" # Replace with code that uses $MOD
done
if $ok; then
echo " OK --> $reponame [$br] $rev"
fi)
这会将使用ok
变量的两个部分放在同一个子shell中,因此您可以对其进行修改,它会产生效果。
推荐阅读
- reactjs - Moment.js 返回错误的日期
- java - 如何在扫描仪中设置无限循环?
- laravel - 如何使用 axios 将图像/文件从 Vue js 上传到 Laravel7
- node.js - EventEmitter 如何处理多个使用同一个回调函数的 eventListener?
- c - 使用指针对C中的数组进行排序
- python - 我正在制作一个运行另一个脚本的脚本python,但它只是继续运行第一个脚本,第二个永远不会
- lua - Lua - 将 .txt 项目列表转换为表格,然后迭代
- android - 构建/运行android aosp后如何修复错误模拟器错误(只显示黑屏)
- python - Python代码在while循环后没有继续
- node.js - DynamoDb UpdateItem 运行两次