Как передать потребителю fd 3 вместо fd1 / fd2

Как упоминалось в комментариях, paste— лучший вариант делать то, что вы хотите.

 paste new_file.txt <sequence file>

Если вы хотите создать последовательность во время выполнения

seq 0 0.005 1 | paste new_file.txt /dev/stdin

Пример (для 5 записей вnew_file.txt)

~$ seq 0 0.005 0.020 | paste new_file.txt /dev/stdin
2.41    0.000
2.56    0.005
2.71    0.010
2.86    0.015
3.01    0.020

Примечание. :Если в каком-либо файле/команде есть дополнительные строки, соответствующие строки в выводе будут пустыми. Поэтому убедитесь, что оба файла имеют одинаковое количество строк.

0
26.08.2019, 12:18
4 ответа
{ echo 'hello on fd3' >&3; } 3>&1 | cat

Здесь echoпишет в стандартный вывод, но мы перенаправляем его в дескриптор файла 3 (это соответствует записи в w, которую вы делаете в своем приложении Node ). Затем мы выводим поток файлового дескриптора 3 на стандартный вывод, чтобы иметь возможность отправить его по конвейеру в cat.

Чтобы также отказаться от стандартного вывода:

{ echo 'hello on fd1'; echo 'hello on fd3' >&3; } 3>&1 1>/dev/null | cat

Первый echoзаписывает в стандартный вывод, а второй записывает через перенаправление, как в первом примере, в файловый дескриптор 3. Затем файловый дескриптор 3 отправляется в стандартный вывод (, чтобы иметь возможность передавать его по конвейеру. )при отказе от стандартного вывода.

Обратите внимание, что 1в 1>/dev/nullна самом деле не нужен и просто добавлен здесь для ясности.

Оба конвейера выводят только hello on fd3.

Для вашего приложения Node:

node foo.js 3>&1 | cat

или, чтобы также отказаться от стандартного вывода,

node foo.js 3>&1 1>/dev/null | cat

или, для отправки стандартного вывода на стандартную ошибку (терминал по умолчанию ),

node foo.js 3>&1 1>&2 | cat
1
28.01.2020, 02:22

Вы можете сделать это без замены процесса и без смешивания fd 1 и 3 или fd 1 и 2:

producer(){ echo to_out; echo >&2 to_err; echo >&3 to_fd3; }
consumer(){ sed "s/^/consumer $@: /" >/dev/tty; }

{ producer 3>&1 >&4 | consumer 3; } 4>&1 | consumer 1
to_err
consumer 1: to_out
consumer 3: to_fd3

{ producer 3>&1 >&4 | consumer 3; } 4>&1
to_out
to_err
consumer 3: to_fd3
3
28.01.2020, 02:22

Не совсем канал через процесс -замена:

# cmd 3> >(cat)

Или, если вы можете смешивать вывод fd3 и stdout,

# cmd 3>&1 | cat
0
28.01.2020, 02:22

Итак, с bash это работает:

exec 3<> >(cat > temp.sh)
echo a >&3 # write to it
exec 3>&- # close fd 3.

но мне интересно, есть ли менее подробный способ сделать это. И обойтись без подмены процесса, вместо использования пайпов.

0
28.01.2020, 02:22

Теги

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