Для справки: это решение на 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 значения.
С bash
4.4 и новее:
cmd1 & p1=$!
cmd2 & p2=$!
wait -n
[ "$?" -gt 1 ] || kill "$p1" "$p2"
wait
wait -n
ожидает завершения первого фонового задания и сообщает о своем статусе выхода в $?
.
Предполагается, что вы хотите убить другое задание, когда первое завершает работу с 0 или 1. Измените команду kill
на exit
, если вы хотите выйти из сценария и оставить другая команда работает без родителей.
Примерно так:
(cmd1; [ "$?" -lt 2 ] && kill "$$") &
(cmd2; [ "$?" -lt 2 ] && kill "$$") &
wait