Перенаправление stdout процесса на его собственный stdin

Solo un servicio podrá vincularse al puerto 53 a la vez (en la misma dirección IP)

Debe deshabilitar/desinstalar DNSMasqsi desea ejecutar bind.

Es probable que /etc/resolv.confesté configurado en localhosto 127.0.0.1, deberá cambiar esto para que apunte a un servidor de nombres real, o si tiene bindconfigurado para reenviar consultas de DNS, entonces puede configurar /etc/resov.confa la dirección bindque está escuchando.

3
28.06.2019, 18:18
1 ответ

Как Мэтью Гюнтер указывает в своем ответе , именованный канал("fifo" )может использоваться для того, чтобы скрипт читал собственный вывод.

#!/bin/bash

# Create pipe and arrange to remove it when done.
mkfifo mypipe
trap 'rm -f mypipe' EXIT

# Just to start off the sequence. Note that this
# needs to be a background process to avoid
# blocking, as there is nobody reading from the
# pipe yet.
echo '0 1' >mypipe &

# Numbers to produce. Note that the produced numbers
# will overflow at n=93.
n=48

# Read the two numbers from the pipe and put the
# last of these back together with the next number
# in the sequence:
while [ "$n" -gt 0 ] && read a b; do
        c=$(( a + b ))
        printf '%d %d\n' "$b" "$c" >&3

        # Also print the "b" number as output.
        printf '%d\n' "$b"

        n=$(( n - 1 ))
done <mypipe 3>mypipe

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

Если вы хотите использовать свой код Python с таким подходом, вы, скорее всего, сделаете что-то вроде

#!/bin/bash

mkfifo mypipe
trap 'rm -f mypipe' EXIT

printf '%d\n%d\n' 0 1 >mypipe &

python3 -c 'if True: # dummy to fix indentation
    b = int(input())
    for _ in range(48):
        a, b = b, int(input())
        print(a + b)' <mypipe >mypipe

Вы заметите, что вы не получаете никаких выходных данных от этого скрипта, потому что мы используем выходные данные кода Python в качестве собственных входных данных. Чтобы получить некоторый вывод в терминале, мы должны сделать что-то подобное в моем цикле оболочки выше (записать что-то, отличное от стандартного вывода):

#!/bin/bash

mkfifo mypipe
trap 'rm -f mypipe' EXIT

printf '%d\n%d\n' 0 1 >mypipe &

python3 -c '
import sys
b = int(input())
for _ in range(48):
    a, b = b, int(input())
    print(a + b)
    print(b, file=sys.stderr)' <mypipe >mypipe

Здесь я (ab -)использую стандартный поток ошибок для предоставления фактического результата пользователю в терминале. Было бы лучше, если бы я сделал это так же, как я сделал цикл оболочки в моем первом варианте (для обработки вывода в конвейер через новый файловый дескриптор ), но мне очень не хватает знаний о Python.

3
27.01.2020, 21:15

Теги

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