#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.