Перенаправление stdout и stderr отдельно по соединению сокета

#bash #sockets #stdout #stderr #socat

Вопрос:

Я пытаюсь запустить скрипт на другой стороне соединения unix-сокета. Для этого я и пытаюсь использовать socat . Сценарий таков

 #!/bin/bash
read MESSAGE1
echo "PID: $"
echo "$MESSAGE1"
sleep 2
read MESSAGE2
echo "$MESSAGE2" 1>amp;2
 

Как слушатель socat у меня есть

 socat unix-listen:my_socket,fork exec:./getmsg.sh,stderr
 

в качестве клиента я использую:

 echo 

и я получаю результат

 PID: 57248
message 1
message 2
 

в то время как файл stderr.txt пуст.

Однако я ожидал, что

  • вывод stdout из сценария на стороне слушателя будет передан в вывод stdout на клиенте и
  • stderr со стороны слушателя на stderr со стороны клиента.

То есть файл stderr.txt должен был содержать содержимое message 2 , а не быть пустым.

Есть идеи о том, как я могу добиться того, чтобы stdout и stderr передавались отдельно, а не объединялись?

Спасибо

Ответ №1:

Если входные и выходные данные представляют собой просто текст с разумно конечной длиной строк, то вы можете легко писать команды muxing и demuxing в чистом Bash.

Единственная проблема заключается в том, как socat (неправильно)обрабатывается stderr ; это в основном либо заставляет его быть тем же файлом, что и файл, stdout либо полностью игнорирует его. В этот момент лучше использовать собственное соглашение о дескрипторах файлов в сценарии обработчика с необычными файловыми дескрипторами, которые не конфликтуют с 0 1 или 2 .

Давайте 11 stdout 12 stderr , например, выберем " за " и "для". Потому stdin что мы можем просто продолжать использовать 0 , как обычно.

getmsg.sh

 #!/bin/bash
set -e -o pipefail

read message
echo "PID: $"  1>amp;11   # to stdout
echo "$message" 1>amp;11   # to stdout
sleep 2
read message
echo "$message" 1>amp;12   # to stderr
 

mux.sh

 #!/bin/bash

"$@" 
11> >(while read line; do printf '%sn' "stdout: ${line}"; done) 
12> >(while read line; do printf '%sn' "stderr: ${line}"; done)
 

demux.sh

 #!/bin/bash
set -e -o pipefail

declare -ri stdout="${1:-1}"
declare -ri stderr="${2:-2}"
while IFS= read -r line; do
  if [[ "$line" = 'stderr: '* ]]; then
    printf '%sn' "${line#stderr: }" 1>amp;"$((stderr))"
  elif [[ "$line" = 'stdout: '* ]]; then
    printf '%sn' "${line#stdout: }" 1>amp;"$((stdout))"
  else
    exit 3  # report malformed stream
  fi
done
 

Несколько примеров

 #!/bin/bash
set -e -o pipefail

socat unix-listen:my_socket,fork exec:'./mux.sh ./getmsg.sh' amp;

declare -ir server_pid="$!"
trap 'kill "$((server_pid))"
      wait -n "$((server_pid))" || :' EXIT

until [[ -S my_socket ]]; do :; done  # ugly

echo '================= raw data from the socket ================='
echo 


Комментарии:

1. "$((stderr))" почему арифметическое расширение? Просто "$stderr" . Используйте while IFS= read -r line вместо while read line и предпочитайте printf "%sn" вместо echo . 😉

2. Арифметическое расширение (в данном случае) - это просто способ документировать / подчеркнуть, что расширенная переменная является целым числом. Я применил это while IFS= read -r предложение; это, безусловно, делает его более универсальным. Я не вижу в этом преимущества printf '%sn' с echo точки зрения производительности или функциональности (но буду рад обновить его, если он есть).

3. I don’t see a benefit unix.stackexchange.com/questions/65803/... 😉 Например printf "%sn" "-e" | socat .... | ./demux.sh , не будет печатать -e , потому echo -e что .

4. Вы правы. Это хороший довод. Я поставил printf на mux.sh demux.sh ".

Ответ №2:

Однако мои ожидания

Существует только один сокет, и через один сокет может быть отправлен один поток данных, а не два. Вы не можете отправлять stdout и stderr (два потока) через один дескриптор (я имею в виду, без их смешивания, т. Е. Без потери информации о том, какие данные из какого потока). Также смотрите объяснение stderr флага с exec in man socat и см. man dup . Как stderr, так и stdout скрипта перенаправляются на один и тот же вывод.

Ожидание было бы таким, что stderr.txt это пусто, потому socat что ничего не пишет в stderr.

как я могу добиться того, чтобы stdout и stderr передавались отдельно, а не объединялись?

Используйте два сокета отдельно для каждого потока.

Передавайте сообщения, используя протокол, который будет различать два потока. Например, простой линейный протокол, который предваряет сообщения:

 # script.sh
echo "stdout: this is stdout"
echo "stderr: this is stderr"

# client
... | socat ... | tee >(sed -n 's/stderr: //p' >amp;2) | sed -n 's/stdout: //p'
 

Комментарии:

1. Спасибо за ответ. Вот что я подозревал. Существует ли простая команда CLI, которая выполняет мультиплексирование и демультиплексирование, потенциально не только на основе строк?

2. Is there a **simple** Я не знаю ни одного. Это основано на мнении - для меня sed -z это просто. В любом случае en.wikipedia.org/wiki/Inter-process_communication . Я думаю , что в настоящее время dbus, я знаю об очередях сообщений ZMQ, POSIX и XSI.

message 1nmessage 2n' | socat -,ignoreeof unix:my_socket 2> stderr.txt
и я получаю результат


в то время как файл stderr.txt пуст.

Однако я ожидал, что

  • вывод stdout из сценария на стороне слушателя будет передан в вывод stdout на клиенте и
  • stderr со стороны слушателя на stderr со стороны клиента.

То есть файл stderr.txt должен был содержать содержимое message 2 , а не быть пустым.

Есть идеи о том, как я могу добиться того, чтобы stdout и stderr передавались отдельно, а не объединялись?

Спасибо

Ответ №1:

Если входные и выходные данные представляют собой просто текст с разумно конечной длиной строк, то вы можете легко писать команды muxing и demuxing в чистом Bash.

Единственная проблема заключается в том, как socat (неправильно)обрабатывается stderr ; это в основном либо заставляет его быть тем же файлом, что и файл, stdout либо полностью игнорирует его. В этот момент лучше использовать собственное соглашение о дескрипторах файлов в сценарии обработчика с необычными файловыми дескрипторами, которые не конфликтуют с 0 1 или 2 .

Давайте 11 stdout 12 stderr , например, выберем " за " и "для". Потому stdin что мы можем просто продолжать использовать 0 , как обычно.

getmsg.sh


mux.sh


demux.sh


Несколько примеров


Комментарии:

1. "$((stderr))" почему арифметическое расширение? Просто "$stderr" . Используйте while IFS= read -r line вместо while read line и предпочитайте printf "%sn" вместо echo . 😉

2. Арифметическое расширение (в данном случае) - это просто способ документировать / подчеркнуть, что расширенная переменная является целым числом. Я применил это while IFS= read -r предложение; это, безусловно, делает его более универсальным. Я не вижу в этом преимущества printf '%sn' с echo точки зрения производительности или функциональности (но буду рад обновить его, если он есть).

3. I don’t see a benefit unix.stackexchange.com/questions/65803/... 😉 Например printf "%sn" "-e" | socat .... | ./demux.sh , не будет печатать -e , потому echo -e что .

4. Вы правы. Это хороший довод. Я поставил printf на mux.sh demux.sh ".

Ответ №2:

Однако мои ожидания

Существует только один сокет, и через один сокет может быть отправлен один поток данных, а не два. Вы не можете отправлять stdout и stderr (два потока) через один дескриптор (я имею в виду, без их смешивания, т. Е. Без потери информации о том, какие данные из какого потока). Также смотрите объяснение stderr флага с exec in man socat и см. man dup . Как stderr, так и stdout скрипта перенаправляются на один и тот же вывод.

Ожидание было бы таким, что stderr.txt это пусто, потому socat что ничего не пишет в stderr.

как я могу добиться того, чтобы stdout и stderr передавались отдельно, а не объединялись?

Используйте два сокета отдельно для каждого потока.

Передавайте сообщения, используя протокол, который будет различать два потока. Например, простой линейный протокол, который предваряет сообщения:


Комментарии:

1. Спасибо за ответ. Вот что я подозревал. Существует ли простая команда CLI, которая выполняет мультиплексирование и демультиплексирование, потенциально не только на основе строк?

2. Is there a **simple** Я не знаю ни одного. Это основано на мнении - для меня sed -z это просто. В любом случае en.wikipedia.org/wiki/Inter-process_communication . Я думаю , что в настоящее время dbus, я знаю об очередях сообщений ZMQ, POSIX и XSI.

message 1nmessage 2n' | socat -,ignoreeof unix:my_socket

echo '================= normal mode of operation ================='
echo

Комментарии:

1. "$((stderr))" почему арифметическое расширение? Просто "$stderr" . Используйте while IFS= read -r line вместо while read line и предпочитайте printf "%sn" вместо echo . 😉

2. Арифметическое расширение (в данном случае) - это просто способ документировать / подчеркнуть, что расширенная переменная является целым числом. Я применил это while IFS= read -r предложение; это, безусловно, делает его более универсальным. Я не вижу в этом преимущества printf '%sn' с echo точки зрения производительности или функциональности (но буду рад обновить его, если он есть).

3. I don’t see a benefit unix.stackexchange.com/questions/65803/... 😉 Например printf "%sn" "-e" | socat .... | ./demux.sh , не будет печатать -e , потому echo -e что .

4. Вы правы. Это хороший довод. Я поставил printf на mux.sh demux.sh ".

Ответ №2:

Однако мои ожидания

Существует только один сокет, и через один сокет может быть отправлен один поток данных, а не два. Вы не можете отправлять stdout и stderr (два потока) через один дескриптор (я имею в виду, без их смешивания, т. Е. Без потери информации о том, какие данные из какого потока). Также смотрите объяснение stderr флага с exec in man socat и см. man dup . Как stderr, так и stdout скрипта перенаправляются на один и тот же вывод.

Ожидание было бы таким, что stderr.txt это пусто, потому socat что ничего не пишет в stderr.

как я могу добиться того, чтобы stdout и stderr передавались отдельно, а не объединялись?

Используйте два сокета отдельно для каждого потока.

Передавайте сообщения, используя протокол, который будет различать два потока. Например, простой линейный протокол, который предваряет сообщения:


Комментарии:

1. Спасибо за ответ. Вот что я подозревал. Существует ли простая команда CLI, которая выполняет мультиплексирование и демультиплексирование, потенциально не только на основе строк?

2. Is there a **simple** Я не знаю ни одного. Это основано на мнении - для меня sed -z это просто. В любом случае en.wikipedia.org/wiki/Inter-process_communication . Я думаю , что в настоящее время dbus, я знаю об очередях сообщений ZMQ, POSIX и XSI.

message 1nmessage 2n' | socat -,ignoreeof unix:my_socket 2> stderr.txt

и я получаю результат


в то время как файл stderr.txt пуст.

Однако я ожидал, что

  • вывод stdout из сценария на стороне слушателя будет передан в вывод stdout на клиенте и
  • stderr со стороны слушателя на stderr со стороны клиента.

То есть файл stderr.txt должен был содержать содержимое message 2 , а не быть пустым.

Есть идеи о том, как я могу добиться того, чтобы stdout и stderr передавались отдельно, а не объединялись?

Спасибо

Ответ №1:

Если входные и выходные данные представляют собой просто текст с разумно конечной длиной строк, то вы можете легко писать команды muxing и demuxing в чистом Bash.

Единственная проблема заключается в том, как socat (неправильно)обрабатывается stderr ; это в основном либо заставляет его быть тем же файлом, что и файл, stdout либо полностью игнорирует его. В этот момент лучше использовать собственное соглашение о дескрипторах файлов в сценарии обработчика с необычными файловыми дескрипторами, которые не конфликтуют с 0 1 или 2 .

Давайте 11 stdout 12 stderr , например, выберем » за » и «для». Потому stdin что мы можем просто продолжать использовать 0 , как обычно.

getmsg.sh


mux.sh


demux.sh


Несколько примеров


Комментарии:

1. "$((stderr))" почему арифметическое расширение? Просто "$stderr" . Используйте while IFS= read -r line вместо while read line и предпочитайте printf "%sn" вместо echo . 😉

2. Арифметическое расширение (в данном случае) — это просто способ документировать / подчеркнуть, что расширенная переменная является целым числом. Я применил это while IFS= read -r предложение; это, безусловно, делает его более универсальным. Я не вижу в этом преимущества printf '%sn' с echo точки зрения производительности или функциональности (но буду рад обновить его, если он есть).

3. I don’t see a benefit unix.stackexchange.com/questions/65803/… 😉 Например printf "%sn" "-e" | socat .... | ./demux.sh , не будет печатать -e , потому echo -e что .

4. Вы правы. Это хороший довод. Я поставил printf на mux.sh «и demux.sh «.

Ответ №2:

Однако мои ожидания

Существует только один сокет, и через один сокет может быть отправлен один поток данных, а не два. Вы не можете отправлять stdout и stderr (два потока) через один дескриптор (я имею в виду, без их смешивания, т. Е. Без потери информации о том, какие данные из какого потока). Также смотрите объяснение stderr флага с exec in man socat и см. man dup . Как stderr, так и stdout скрипта перенаправляются на один и тот же вывод.

Ожидание было бы таким, что stderr.txt это пусто, потому socat что ничего не пишет в stderr.

как я могу добиться того, чтобы stdout и stderr передавались отдельно, а не объединялись?

Используйте два сокета отдельно для каждого потока.

Передавайте сообщения, используя протокол, который будет различать два потока. Например, простой линейный протокол, который предваряет сообщения:


Комментарии:

1. Спасибо за ответ. Вот что я подозревал. Существует ли простая команда CLI, которая выполняет мультиплексирование и демультиплексирование, потенциально не только на основе строк?

2. Is there a **simple** Я не знаю ни одного. Это основано на мнении — для меня sed -z это просто. В любом случае en.wikipedia.org/wiki/Inter-process_communication . Я думаю , что в настоящее время dbus, я знаю об очередях сообщений ZMQ, POSIX и XSI.

message 1nmessage 2n’ | socat -,ignoreeof unix:my_socket
| ./demux.sh

echo ‘================= demux / mux test for fun =================’
echo

Комментарии:

1. "$((stderr))" почему арифметическое расширение? Просто "$stderr" . Используйте while IFS= read -r line вместо while read line и предпочитайте printf "%sn" вместо echo . 😉

2. Арифметическое расширение (в данном случае) — это просто способ документировать / подчеркнуть, что расширенная переменная является целым числом. Я применил это while IFS= read -r предложение; это, безусловно, делает его более универсальным. Я не вижу в этом преимущества printf '%sn' с echo точки зрения производительности или функциональности (но буду рад обновить его, если он есть).

3. I don’t see a benefit unix.stackexchange.com/questions/65803/… 😉 Например printf "%sn" "-e" | socat .... | ./demux.sh , не будет печатать -e , потому echo -e что .

4. Вы правы. Это хороший довод. Я поставил printf на mux.sh «и demux.sh «.

Ответ №2:

Однако мои ожидания

Существует только один сокет, и через один сокет может быть отправлен один поток данных, а не два. Вы не можете отправлять stdout и stderr (два потока) через один дескриптор (я имею в виду, без их смешивания, т. Е. Без потери информации о том, какие данные из какого потока). Также смотрите объяснение stderr флага с exec in man socat и см. man dup . Как stderr, так и stdout скрипта перенаправляются на один и тот же вывод.

Ожидание было бы таким, что stderr.txt это пусто, потому socat что ничего не пишет в stderr.

как я могу добиться того, чтобы stdout и stderr передавались отдельно, а не объединялись?

Используйте два сокета отдельно для каждого потока.

Передавайте сообщения, используя протокол, который будет различать два потока. Например, простой линейный протокол, который предваряет сообщения:


Комментарии:

1. Спасибо за ответ. Вот что я подозревал. Существует ли простая команда CLI, которая выполняет мультиплексирование и демультиплексирование, потенциально не только на основе строк?

2. Is there a **simple** Я не знаю ни одного. Это основано на мнении — для меня sed -z это просто. В любом случае en.wikipedia.org/wiki/Inter-process_communication . Я думаю , что в настоящее время dbus, я знаю об очередях сообщений ZMQ, POSIX и XSI.

message 1nmessage 2n’ | socat -,ignoreeof unix:my_socket 2> stderr.txtи я получаю результат


в то время как файл stderr.txt пуст.

Однако я ожидал, что

  • вывод stdout из сценария на стороне слушателя будет передан в вывод stdout на клиенте и
  • stderr со стороны слушателя на stderr со стороны клиента.

То есть файл stderr.txt должен был содержать содержимое message 2 , а не быть пустым.

Есть идеи о том, как я могу добиться того, чтобы stdout и stderr передавались отдельно, а не объединялись?

Спасибо

Ответ №1:

Если входные и выходные данные представляют собой просто текст с разумно конечной длиной строк, то вы можете легко писать команды muxing и demuxing в чистом Bash.

Единственная проблема заключается в том, как socat (неправильно)обрабатывается stderr ; это в основном либо заставляет его быть тем же файлом, что и файл, stdout либо полностью игнорирует его. В этот момент лучше использовать собственное соглашение о дескрипторах файлов в сценарии обработчика с необычными файловыми дескрипторами, которые не конфликтуют с 0 1 или 2 .

Давайте 11 stdout 12 stderr , например, выберем » за » и «для». Потому stdin что мы можем просто продолжать использовать 0 , как обычно.

getmsg.sh


mux.sh


demux.sh


Несколько примеров


Комментарии:

1. "$((stderr))" почему арифметическое расширение? Просто "$stderr" . Используйте while IFS= read -r line вместо while read line и предпочитайте printf "%sn" вместо echo . 😉

2. Арифметическое расширение (в данном случае) — это просто способ документировать / подчеркнуть, что расширенная переменная является целым числом. Я применил это while IFS= read -r предложение; это, безусловно, делает его более универсальным. Я не вижу в этом преимущества printf '%sn' с echo точки зрения производительности или функциональности (но буду рад обновить его, если он есть).

3. I don’t see a benefit unix.stackexchange.com/questions/65803/… 😉 Например printf "%sn" "-e" | socat .... | ./demux.sh , не будет печатать -e , потому echo -e что .

4. Вы правы. Это хороший довод. Я поставил printf на mux.sh «и demux.sh «.

Ответ №2:

Однако мои ожидания

Существует только один сокет, и через один сокет может быть отправлен один поток данных, а не два. Вы не можете отправлять stdout и stderr (два потока) через один дескриптор (я имею в виду, без их смешивания, т. Е. Без потери информации о том, какие данные из какого потока). Также смотрите объяснение stderr флага с exec in man socat и см. man dup . Как stderr, так и stdout скрипта перенаправляются на один и тот же вывод.

Ожидание было бы таким, что stderr.txt это пусто, потому socat что ничего не пишет в stderr.

как я могу добиться того, чтобы stdout и stderr передавались отдельно, а не объединялись?

Используйте два сокета отдельно для каждого потока.

Передавайте сообщения, используя протокол, который будет различать два потока. Например, простой линейный протокол, который предваряет сообщения:


Комментарии:

1. Спасибо за ответ. Вот что я подозревал. Существует ли простая команда CLI, которая выполняет мультиплексирование и демультиплексирование, потенциально не только на основе строк?

2. Is there a **simple** Я не знаю ни одного. Это основано на мнении — для меня sed -z это просто. В любом случае en.wikipedia.org/wiki/Inter-process_communication . Я думаю , что в настоящее время dbus, я знаю об очередях сообщений ZMQ, POSIX и XSI.

message 1nmessage 2n’ | socat -,ignoreeof unix:my_socket
| ./mux.sh ./demux.sh 11 12

Комментарии:

1. "$((stderr))" почему арифметическое расширение? Просто "$stderr" . Используйте while IFS= read -r line вместо while read line и предпочитайте printf "%sn" вместо echo . 😉

2. Арифметическое расширение (в данном случае) — это просто способ документировать / подчеркнуть, что расширенная переменная является целым числом. Я применил это while IFS= read -r предложение; это, безусловно, делает его более универсальным. Я не вижу в этом преимущества printf '%sn' с echo точки зрения производительности или функциональности (но буду рад обновить его, если он есть).

3. I don’t see a benefit unix.stackexchange.com/questions/65803/… 😉 Например printf "%sn" "-e" | socat .... | ./demux.sh , не будет печатать -e , потому echo -e что .

4. Вы правы. Это хороший довод. Я поставил printf на mux.sh «и demux.sh «.

Ответ №2:

Однако мои ожидания

Существует только один сокет, и через один сокет может быть отправлен один поток данных, а не два. Вы не можете отправлять stdout и stderr (два потока) через один дескриптор (я имею в виду, без их смешивания, т. Е. Без потери информации о том, какие данные из какого потока). Также смотрите объяснение stderr флага с exec in man socat и см. man dup . Как stderr, так и stdout скрипта перенаправляются на один и тот же вывод.

Ожидание было бы таким, что stderr.txt это пусто, потому socat что ничего не пишет в stderr.

как я могу добиться того, чтобы stdout и stderr передавались отдельно, а не объединялись?

Используйте два сокета отдельно для каждого потока.

Передавайте сообщения, используя протокол, который будет различать два потока. Например, простой линейный протокол, который предваряет сообщения:


Комментарии:

1. Спасибо за ответ. Вот что я подозревал. Существует ли простая команда CLI, которая выполняет мультиплексирование и демультиплексирование, потенциально не только на основе строк?

2. Is there a **simple** Я не знаю ни одного. Это основано на мнении — для меня sed -z это просто. В любом случае en.wikipedia.org/wiki/Inter-process_communication . Я думаю , что в настоящее время dbus, я знаю об очередях сообщений ZMQ, POSIX и XSI.

message 1nmessage 2n’ | socat -,ignoreeof unix:my_socket 2> stderr.txt

и я получаю результат


в то время как файл stderr.txt пуст.

Однако я ожидал, что

  • вывод stdout из сценария на стороне слушателя будет передан в вывод stdout на клиенте и
  • stderr со стороны слушателя на stderr со стороны клиента.

То есть файл stderr.txt должен был содержать содержимое message 2 , а не быть пустым.

Есть идеи о том, как я могу добиться того, чтобы stdout и stderr передавались отдельно, а не объединялись?

Спасибо

Ответ №1:

Если входные и выходные данные представляют собой просто текст с разумно конечной длиной строк, то вы можете легко писать команды muxing и demuxing в чистом Bash.

Единственная проблема заключается в том, как socat (неправильно)обрабатывается stderr ; это в основном либо заставляет его быть тем же файлом, что и файл, stdout либо полностью игнорирует его. В этот момент лучше использовать собственное соглашение о дескрипторах файлов в сценарии обработчика с необычными файловыми дескрипторами, которые не конфликтуют с 0 1 или 2 .

Давайте 11 stdout 12 stderr , например, выберем » за » и «для». Потому stdin что мы можем просто продолжать использовать 0 , как обычно.

getmsg.sh


mux.sh


demux.sh


Несколько примеров


Комментарии:

1. "$((stderr))" почему арифметическое расширение? Просто "$stderr" . Используйте while IFS= read -r line вместо while read line и предпочитайте printf "%sn" вместо echo . 😉

2. Арифметическое расширение (в данном случае) — это просто способ документировать / подчеркнуть, что расширенная переменная является целым числом. Я применил это while IFS= read -r предложение; это, безусловно, делает его более универсальным. Я не вижу в этом преимущества printf '%sn' с echo точки зрения производительности или функциональности (но буду рад обновить его, если он есть).

3. I don’t see a benefit unix.stackexchange.com/questions/65803/… 😉 Например printf "%sn" "-e" | socat .... | ./demux.sh , не будет печатать -e , потому echo -e что .

4. Вы правы. Это хороший довод. Я поставил printf на mux.sh «и demux.sh «.

Ответ №2:

Однако мои ожидания

Существует только один сокет, и через один сокет может быть отправлен один поток данных, а не два. Вы не можете отправлять stdout и stderr (два потока) через один дескриптор (я имею в виду, без их смешивания, т. Е. Без потери информации о том, какие данные из какого потока). Также смотрите объяснение stderr флага с exec in man socat и см. man dup . Как stderr, так и stdout скрипта перенаправляются на один и тот же вывод.

Ожидание было бы таким, что stderr.txt это пусто, потому socat что ничего не пишет в stderr.

как я могу добиться того, чтобы stdout и stderr передавались отдельно, а не объединялись?

Используйте два сокета отдельно для каждого потока.

Передавайте сообщения, используя протокол, который будет различать два потока. Например, простой линейный протокол, который предваряет сообщения:


Комментарии:

1. Спасибо за ответ. Вот что я подозревал. Существует ли простая команда CLI, которая выполняет мультиплексирование и демультиплексирование, потенциально не только на основе строк?

2. Is there a **simple** Я не знаю ни одного. Это основано на мнении — для меня sed -z это просто. В любом случае en.wikipedia.org/wiki/Inter-process_communication . Я думаю , что в настоящее время dbus, я знаю об очередях сообщений ZMQ, POSIX и XSI.