2017-02-04 2 views
2

очень простой способ продемонстрировать это запуститьБаш `чтения -t` не работает на трубе

mkfifo /tmp/a 
read -t 1 a < /tmp/a 

чтения никогда не вернется.

Руководство Bash говорит: Этот параметр эффективен только если чтение является чтение входных данных из терминала, труб, или другого специального файла; это не имеет никакого эффекта при чтении из обычных файлов

но/TMP/а труба, выход Ls является

ls -l /tmp/a 
prw-r--r-- 1 root root 0 Feb 4 22:18 /tmp/a 

версия Баш:

GNU Баш, версия 4.3.46 (1) -release (x86_64-pc-linux-gnu) Copyright (C) 2013 Free Software Foundation, Inc.

ОС является:

Ubuntu 16.04.1 LTS 

ответ

1

Когда вы читаете из трубы, там должен быть кто-то писать на трубе, а также. «Труба» - это всего лишь коммуникационный механизм. Он не «генерирует» какой-либо ввод сам по себе; он просто передаст свой вход в конец вывода. Кажется, что вы просто читаете, но никто не пишет /tmp/a.

read Когда ждет ввода делать echo hello > /tmp/a из другого терминала, и вы увидите, что read возвращается и a имеет значение «привет».

Читайте о трубах подробно здесь: http://man7.org/linux/man-pages/man7/pipe.7.html

+0

когда преобразование приложений: Трассирование Баша -c «чтения -t 3 а yuanjianpeng

+0

получил это, спасибо большое. Наконец, я использую: timeout 3 bash -c «читать a yuanjianpeng

+0

'read' просто заблокирован до тех пор, пока кто-то не напишет об этом. 'timeout' не сильно меняется. Он просто прекращает« читать »от дальнейшего ожидания. Но проблема * real * заключается в том, что никто не пишет в трубу. Возможно, вы захотите прочитать руководство, связанное с понять, как работают трубы. – usr