Когда вы:
exec 3<> /dev/ttyACM0
... вы открываете файл-дискайптор для чтения/записи на usb serial tty на 3, который автоматически наследуется детьми - например, клонированные подоболочки - и поэтому вы можете прочитать его с помощью cat позже в вашем фоновом конвейере.
Дело в том, что поскольку вы делаете фоновый конвейер - который помещает его и все связанные с ним подоболочки в отдельную группу процессов - он не закрывается для процессов конвейера позже, когда вы...
exec 3<&-
... и закроете этот дескриптор для текущих процессов оболочки скрипта. Вместо этого...
cat > file &
...висит в фоновом режиме, ничего не читая до тех пор, пока нечего читать, и все время держит открытую строку на этой tty. Это происходит потому, что cat
только выходит из своего входа на EOF, который, в данном случае, он никогда не получает.
Вы можете сделать:
cat /dev/tty
... по вашей просьбе, чтобы аппроксимировать это поведение.
Что вам следует сделать, так это явно выйти из входа, как только вы прочитаете столько, сколько вам нужно, или явно убить cat
после того, как вы прочитаете столько, сколько вам нужно, или явно убить cat
после того, как вы прочитаете столько, сколько вам нужно. Вы можете сделать это как:
head -n"$GUARANTEED_NUM_AVAIL_INPUT LINES" <&3 >>file
... или с помощью sed [num]q
или аналогичным способом. Таким образом, Вам следует вообще избежать необходимости использования |pipe
, и, скорее всего, Вы можете полностью опустить и
фоновый рисунок. В противном случае Вы можете убить cat
:
cat <&3 >>file &
sleep 1 && kill "$!"
... но, вероятно, в этом нет необходимости, так как выход из входного сигнала намного проще.
В стороне, стоит отметить, что ваш скрипт уже полностью состоит из портативного синтаксиса, и поэтому, вероятно, стоит изменить строку #!/bin/bash
и вместо этого вызвать более легкий вес - и, вероятно, быстрее - оболочки вместо этого. Я рекомендую dash
для чего-то подобного. Посмотрите здесь , если вас интересует эта линия мышления для q&a о сравнении производительности различных оболочек - чтобы включить как bash
, так и dash
.
Пара вариантов вашего варианта 2 кажутся правдоподобными. Я продолжу считать, что вы обычно входите в систему с помощью $USER
на $HOME
, как и в вашем сценарии. Вы заявили, что не можете скопировать файлы с $HOME
на $CHOME
из-за проблем с разрешениями ($USER
не может получить доступ к $CUSER
), и вы не можете обойти его с помощью root из-за вашего root_squash
.
2a. Настройте разрешения для $USER
и $CUSER
таким образом, чтобы они принадлежали к общей первичной группе. Установите маску umask 002
для обоих, чтобы они создавали файлы с групповыми правами доступа так же, как и для пользователя. Обновите все файлы в $HOME
и $CHOME
так, чтобы право собственности на группу принадлежало этой новой группе. Используйте rsync -avH --no-владельца [--delete] $HOME/ $CHOME/
для копирования измененных файлов. Запустите пару заданий cron
(одно для $USER
и одно для $CUSER
), чтобы исправить ошибки в разрешениях и членстве в группах всех файлов.
2b. Оставьте все "как есть" и скопируйте файлы с одной учетной записи на другую, используя rsync
с клиента на себя, меняя идентификационные данные по всему соединению: rsync -avH [--delete] $HOME/ ${CUSER}@localhost: