Я использую perl в сценарии bash, который передает регулярное выражение. Как мне также установить переменную в конвейерном потоке? - PullRequest
0 голосов
/ 17 июня 2020

Я создал сценарий bash, который выполняется на нескольких машинах, содержащих разные git локальные репозитории. Он проверяет множество условий и сообщает мне, есть ли в репозитории незафиксированные файлы, неотслеживаемые файлы, и, в частности, один тест сообщает мне, что локальный опережает или отстает от удаленного по количеству коммитов. Проблема со сценарием заключается в том, что он не возвращает и не устанавливает флаг «ОК», который я использую для вывода сообщения «ОК», если все синхронизировано c. Итак, я получаю сообщение, что он впереди или позади, но затем получаю сообщение «ОК». Вот часть скрипта, которая делает вперед или назад, и я не вижу, как заставить его каким-то образом установить 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 

Я скопировал это из другого скрипта и не делаю этого. t действительно понимаю 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 Ответ

2 голосов
/ 17 июня 2020

В большинстве реализаций оболочки все процессы в конвейере выполняются в подоболочке. В этом случае вы запускаете while l oop в конце конвейера, поэтому он (и только он) находится в подоболочке. Независимо от того, установили ли вы ok в false или нет, это не повлияет на блок if, потому что он запускает основную оболочку, которая не наследует переменные от подоболочки.

zsh и AT&T k sh (но не другие реализации k sh) выполняет последнюю команду в основной оболочке, а не в подоболочке. POSIX допускает любое поведение, но поведение bash гораздо чаще встречается среди оболочек.

Самый простой способ справиться с этим - выполнить всю интересующую вас команду в подоболочке:

  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, в одну подоболочку, так что вы можете изменить ее, и это будет иметь эффект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...