Возможно ли иметь несколько параллельных сопроцессов?

Предполагается, что оболочка csh:

Чтобы просто добавить строку после другой:

% sed '/line2/a\\
# new line here\
' file
line1
line2
# new line here
line3
line4

Чтобы вставить строку перед другой:

% sed '/line3/i\\
# new line here\
' file
line1
line2
# new line here
line3
line4

Замена строки двумя новыми строками с помощью команды s:

% sed 's/line2/&\\
# new line here/' file
line1
line2
# new line here
line3
line4

Протестировано на OpenBSD 6.1 с запущенными sedи cshиз базовой системы.

3
22.07.2019, 18:28
2 ответа

Из раздела "ОШИБКИ" в самом конце руководства bash:

There may be only one active coprocess at a time.

5
27.01.2020, 21:12

Q1: Is it possible to have multiple coprocesses running at the same time?

В Bash v4 и выше (, включая текущую v5 ), официально нет, как отмечает @Kusalananda.

Тем не менее, я могу сказать вам, что это может работать, несмотря на предупреждение, но, конечно, без гарантии и YMMV. Подробнее см. здесь .

Q2: If so, how should the script above be modified to achieve the desired output?

Это может(как описано выше )работать нормально, как только вы исправите:

exec {INNER_READER}<&"{INNER[0]}"  # <-- lacks the '$' sign for the 'INNER[0]' variable

, что вызывает:

./coproctest.sh: line 19: INNER_READER: ambiguous redirect
сообщение

и, следовательно, также:

./coproctest.sh: line 21: read: : invalid file descriptor specification

сообщение.

Это работает для меня, как только это было исправлено и предупреждение в сторону.

Что касается других примечаний:

  • Нет необходимости дублировать дескрипторы coprocфайла -, если только вы не хотите передать их дочернему процессу (вспомогательной -оболочке, команде или сценарию)
  • Вы, вероятно, сделали это, потому что команда seqестественным образом завершилась быстро, и поэтому автоматические переменные исчезли до того, как вы смогли их использовать. Поступая так, как вы, эти повторяющиеся файловые дескрипторы -будут унаследованы всеми последующими командами и фоновыми процессами, что может быть нежелательно, если ваш процесс co -фактически использует свой входной канал и ожидает его закрытия, чтобы выйти. Таким образом, другой подход к адресу, который основан на механизме синхронизации, например, сделайте ваш процесс OUTERco -равным { seq 3; exec >&-; read; }, а затем, когда вы использовали его ввод из основного сценария, выполните, например. echo >&${OUTER[1]}; wait "${OUTER_PID}"чтобы позволить со -процессу readпродолжаться, а затем waitдля него. Обратите внимание, что не гарантируется, что waitбудет выполнено до того, как переменная $OUTER_PIDисчезнет :, в таком случае вы можете просто отключить предупреждающее сообщение (или полностью проигнорировать его )и, возможно, принудительно установить статус успеха с помощью|| true
  • В качестве личной -заметки я могу сказать вам, что если вы действительно настроены на одновременное выполнение нескольких со-процессов,вы можете -реализовать грубый эквивалент coprocс использованием синтаксиса Bash v3 поверх фоновых процессов плюс mkfifoименованные -FIFO, а также в Linux с уловкой с заменой процессов вместо mkfifoс. С синтаксисом Bash v4 это может быть менее сложным, но все же сложным упражнением.
2
27.01.2020, 21:12

Теги

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