Как я могу запустить две команды параллельно и завершить их, если ОДНА из них завершается кодом выхода 0?

Для справки: это решение на awk (не очень сложное) на случай, если вам понадобится интегрировать это решение в любой из ваших существующих проектов на awk.

a="1.Nf3 c5 2.e4 Nc6"
b="1.e4 c5 2.Nf3 Nc6"
awk 'BEGIN{FS=""}{last=NF;for (i=1;i<=NF;i++) {if (NR==FNR) {a[i]=$i} else {b[i]=$i}}} \
{asort(a);asort(b)}END{{for (k=1;k<=last;k++) if (a[k]!=b[k]) nomatch++}{print (nomatch==0)?"match":"no match"}}' <(echo "$a") <(echo "$b")

Если вы просто хотите сравнить эти две строки, я бы использовал какой-нибудь bash способ, как советует xhienne, или даже что-то вроде этого:

[[ $(sort <(grep -o . <<<"$a") |base64) == $(sort <(grep -o . <<<"$b") |base64) ]] && echo "match" || echo "differ"

В обоих случаях логика одинакова. Входная строка разбивается на символы, затем сортируется по одному и эти две отсортированные строки сравниваются.

В приведенном выше bash-способе я думал закодировать отсортированные строки в base64 и сравнить их base64 значения.

5
12.01.2017, 01:26
2 ответа

С bash 4.4 и новее:

cmd1 & p1=$!
cmd2 & p2=$!

wait -n
[ "$?" -gt 1 ] || kill "$p1" "$p2"
wait

wait -n ожидает завершения первого фонового задания и сообщает о своем статусе выхода в $? .

Предполагается, что вы хотите убить другое задание, когда первое завершает работу с 0 или 1. Измените команду kill на exit , если вы хотите выйти из сценария и оставить другая команда работает без родителей.

1
27.01.2020, 20:37

Примерно так:

(cmd1; [ "$?" -lt 2 ] && kill "$$") &
(cmd2; [ "$?" -lt 2 ] && kill "$$") &
wait
6
27.01.2020, 20:37

Теги

Похожие вопросы