我在bash脚本中使用perl,该脚本通过管道传递到正则表达式。如何在管道流中设置变量?

时间:2020-06-17 01:45:09

标签: regex bash perl

我创建了一个bash脚本,该脚本可在包含不同git本地存储库的多台计算机上运行。它测试了许多条件,并告诉我存储库中是否有未提交的文件,未跟踪的文件,尤其是一项测试,它告诉我本地在提交数量上是在远程之前还是之后。脚本的问题在于它不会返回或设置“ 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变量之前对其进行设置?

1 个答案:

答案 0 :(得分:2)

在大多数Shell实现中,管道中的所有进程都在子Shell中运行。在这种情况下,您正在管道的末尾运行while循环,因此它(以及它本身)位于子外壳中。无论您是否将ok设置为false,它都对if块没有影响,因为它运行的是主shell,而该shell不会从subshel​​l继承变量。

zsh和AT&T ksh(但不是其他ksh实现)在主外壳而不是子外壳中执行最后一个命令。 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变量放在同一子外壳中,因此您可以对其进行修改,并且会起作用。

相关问题