Используйте sponge
из GNU moreutils
:
echo 'a lot of content' | command 1 | sponge file.txt
Или используйте временный файл.
Здесь участвуют два уровня :Уровень input
ядра, который переводит различные клавиатуры, мыши, джойстики и т. д. в общую структуру и делает их доступными в /dev/input/*
файлах устройств (один файл на устройство )и уровень X (или, в зависимости от вашего дистрибутива, уровень Wayland ), который считывает эти файлы и преобразует их в события X, понятные графическим приложениям. Последний объединяет устройства ввода и делает их доступными как «события клавиатуры с любого устройства» и «события мыши с любого устройства» (. Это упрощение, но это первое приближение ).
Естественным способом для приложения является взаимодействие с уровнем X (, и я уверен, что для этого существует абстракция Ruby ). Это особенно рекомендуется, если ваше приложение не только воспроизводит звуки, но и что-то отображает (и даже если оно ничего не отображает ).
Конечно, если вы настаиваете, вы также можете открыть все файлы в /dev/input/*
и интерпретировать исходящие от них события, но это не сработает в тот момент, когда будет подключена новая клавиатура или мышь, и вы захотите отреагировать на эти события тоже.
Абстракция /dev/input/mice
существует только для мышей и является своего рода устаревшим решением, изобретенным в то время, когда люди использовали одну клавиатуру PS/2, но уже существовало множество различных устройств для мыши. Этот файл может не соответствовать тому, что слой X считает активными устройствами ввода мыши, и нет эквивалентной абстракции для клавиатур.