Вас сбивает с толку обычная концепция, что все в системе Linux - это файл. Чтобы проиллюстрировать это, я поместил ваши команды в файл forever
, затем нашел PID процесса, затем
$ file /proc/25546/fd/*
/proc/25546/fd/0: symbolic link to `/dev/pts/12'
/proc/25546/fd/1: symbolic link to `/dev/pts/12'
/proc/25546/fd/2: symbolic link to `/dev/pts/12'
/proc/25546/fd/255: symbolic link to `/home/me/tmp/forever'
$ file /dev/pts/12
/dev/pts/12: character special
Это показывает, что ваши файловые дескрипторы 1,2,3 являются символьными файлами. Теперь хорошо известно (см., Например, этот ответ по Unix и Linux), что:
Символьные устройства (также называемые символьными специальными файлами) ведут себя как каналы, последовательные порты и т. Д .: запись или чтение в них является немедленным действием. Но то, что водитель делает с данными, это его личное дело. Запись байта в символьное устройство может привести к его отображению на экране, выводу через последовательный порт, преобразованию в звук, ... Чтение байта с устройства может привести к тому, что последовательный порт будет ожидать ввода, может вернуть случайный байт (/dev/urandom), ...
Поэтому вам нужен другой способ выполнения IPC (= межпроцессное взаимодействие). В Unix и Linux для этого есть именованные каналы . Измените ваш скрипт следующим образом:
#!/bin/bash
MYPIPE=/tmp/my_pipe
if [[ ! -p $MYPIPE ]]; then
mkfifo $MYPIPE
fi
while true
do
if read line <$pipe; then
if [[ "$line" == 'quit' ]]; then
break
fi
echo $line >> /tmp/debug.txt
fi
done
echo "I quit"
Запустить скрипт; из другого типа терминала
$ cat > /tmp/my_pipe
My name is
George Washington
....
В третьем терминале, используя tail -f /tmp/debug.txt
, вы увидите, что вы только что набрали во втором терминале, и снова появитесь из /tmp/debug.txt
.
В Android ситуация немного сложнее, но здесь и здесь вы найдете два разных способа решения проблемы создания именованных каналов на некорневом устройстве Android (первый проще, чем второй).