Могу ли я смоделировать tee util с использованием дополнительных файловых дескрипторов?

Согласно документации libvirt, qemu имеет расширение VNC для включения звука. Некоторые средства просмотра, такие как xvnctitanviewer, поддерживают это расширение, как следует из этого ответа. Если вы перенаправляете звук через виртуальную машину qa qemu, вы можете сделать это через это расширение VNC.

0
01.07.2017, 02:44
2 ответа

Оператор перенаправления меняетнаправление вывода (или источник ввода). 3>&1означает «сделать так, чтобы файловый дескриптор 3 указывал туда, куда в данный момент указывает файловый дескриптор 1» (который является терминалом). 3>fileозначает «сделать так, чтобы файловый дескриптор 3 указывал на file». За то короткое время, когда fd 3 указывал на терминал, ничего не произошло, так что вы не получите никакого вывода терминала.

Чтобы получить одни и те же данные в двух местах, что-то должно копировать данные. Это работа tee.Для каждого прочитанного байта он выводит этот байт дважды (если задан один файловый аргумент плюс его стандартный вывод).

Пусть вас не смущает тот факт, что >&иногда называют дублированием. Он дублирует файловый дескриптор: 3>&1дублирует fd 1 в fd 3, что означает, что данные, идущие в fd 1, и данные, идущие в fd 3, объединяются — они оба идут туда, куда указывал fd 1.

Если вы предпочитаете графические пояснения, см. , что подразумевается под соединением STDOUT и STDIN? и Как команда может иметь более одного вывода?

В любом случае ваша команда ничего не выводит на файловый дескриптор 3, поэтому перенаправление fd 3 ничего не меняет. Команда dateзаписывает в свой стандартный вывод, то есть fd 1, и вы не перенаправляете его.


В Zsh есть функция, называемая multios, которая изменяет значение перенаправления вывода. Если существует несколько перенаправлений вывода для одной и той же команды в одном файловом дескрипторе, то первое изменяетместо, куда указывает этот дескриптор, а последующие реплицируютданные в указанные цели. Например, чтобы получить вывод в файл в дополнение к тому, куда указывал стандартный вывод, вы можете использовать

date >&1 >file

Zsh выполняет работу tee.Обратите внимание, что порядок перенаправления имеет значение – date >file >&1будет дважды записывать в file, поскольку к тому времени, когда оператор >&1вычислит стандартный вывод от датыуже собирается в файл.

4
28.01.2020, 02:19

Нет, поскольку вывод не дублируется. Чтобы продублировать файловые дескрипторы, вы также должны дважды вывести на них.

Хотя можно и с циклом, вот так:

while read l
do
   echo "$l" >&3
   echo "$l" >&4
done

С бинарными данными будут глючить (нули выбиты, crlf -s будут преобразованы в lf ).

Ваш пример сделал это:

  1. открыл fd 3 в файл
  2. клонировал fd 1 в вместо fd 3 (, т. е. он закрыл ваш предыдущий fd3, а затем сделал fd3 «альтернативным адресом» вашего предыдущего stdout ).

Перенаправление, по сути, является клоном, в терминологии Unix,это как жесткая ссылка. С суффиксом 3>&1к команде у вас будут fd 3 и fd 1, указывающие на один и тот же объект (, который теперьfile).

Если у вас есть некоторое сходство с C, я хотел бы проверить man 3 dup2, это именно то, что делает перенаправление fd.

1
28.01.2020, 02:19

Теги

Похожие вопросы