Как перенаправить стандартный ввод в FIFO с помощью bash

Я пытаюсь перенаправить стандартный ввод в FIFO с помощью bash. Таким образом, я смогу использовать этот стандартный ввод в другой части скрипта.

Однако, похоже, это не работает так, как я хочу

script.bash

#!/bin/bash

rm /tmp/in -f
mkfifo /tmp/in
cat >/tmp/in &

# I want to be able to reuse /tmp/in from an other process, for example : 
xfce4-terminal --hide-menubar --title myotherterm --fullscreen -x bash -i -c "less /tmp/in"

Здесь я ожидал бы, что когда я запускаю ls | ./script.bash, увижу вывод ls, но он не работает (например, скрипт завершает работу, ничего не выводя)

Что я неправильно понимаю?


person edi9999    schedule 26.01.2017    source источник
comment
Зачем вам нужен FIFO, а не просто чтение из стандартного ввода, когда это необходимо?   -  person chepner    schedule 26.01.2017
comment
Потому что то, что требует стандартного ввода, выполняется в другом процессе (см. обновленный вопрос)   -  person edi9999    schedule 26.01.2017
comment
Я не уверен, что понимаю, чего вы пытаетесь достичь. Когда cat передается /dev/stdin в качестве аргумента, это относится к стандартному вводу cat, а не к вашей оболочке (по крайней мере, так кажется в моей системе Linux). cat без аргументов копирует свой стандартный ввод в стандартный вывод, а с /dev/stdin в качестве единственного аргумента делает то же самое. Я подозреваю, что это не то, что вы хотите.   -  person Fred    schedule 27.01.2017
comment
Нет, это именно то, что я хочу, я хочу перенаправить стандартный ввод в fifo. Я удалю /dev/stdin, так как он уже неявный   -  person edi9999    schedule 27.01.2017


Ответы (2)


Я почти уверен, что меньше нужен дополнительный флаг -f при чтении из канала.

test_pipe is not a regular file (use -f to see it)

Если это не поможет, я бы также рекомендовал изменить порядок между двумя последними строками вашего скрипта:

#!/bin/bash

rm /tmp/in -f
mkfifo /tmp/in

xfce4-terminal --hide-menubar --title myotherterm --fullscreen -x bash -i -c "less -f /tmp/in" &

cat /dev/stdin >/tmp/in
person Kamil    schedule 26.01.2017
comment
В чем разница между использованием cat /dev/stdin > /tmp/in и чтением из стандартного ввода напрямую с помощью less -f /dev/stdin? - person Derek Mahar; 24.03.2021

В общем, я избегаю использования /dev/stdin, потому что получаю много сюрпризов от того, что такое /dev/stdin, особенно при использовании редиректов.

Однако я думаю, что вы видите, что less завершается до того, как ваш терминал полностью запустится. Когда less закончится, закончится и терминал, и вы не получите никакого вывода.

Например:

xterm -e ls

также не будет отображать терминал.

Решение может быть tail -f, как, например,

#!/bin/bash

rm -f /tmp/in
mkfifo /tmp/in
xterm -e "tail -f /tmp/in" &

while :; do
    date > /tmp/in
    sleep 1
done

потому что tail -f остается живым.

person Ljm Dullaart    schedule 26.01.2017