Создайте виртуальный файл, который является на самом деле командой

Как Mat сказал, добавление отступа (и пробел в целом) не важно в XML-файлах. Это:

<one><tags></tags></one>

Точно эквивалентно:

<one>
 <tags>
 </tags>
</one>

Но это будет работать при сохранении добавления отступа:

$ cat myfile.xml
<tags>
</tags>
$ sed '/<one>/ a\
  <tags>\
  </tags>
' myfile.xml > newfile.xml
$ cat newfile.xml
<one>
  <tags>
  </tags>
</one>

... но если Вы работаете с XML, Вы могли бы хотеть думать об использовании высокоуровневого языка, который может на самом деле проанализировать XML и управлять деревом программно.

18
06.03.2013, 01:59
5 ответов

Можно искать именованный канал.

mkfifo f
{
  echo 'V cebqhpr bhgchg.'
  sleep 2
  echo 'Urer vf zber bhgchg.'
} >f
rot13 < f

Запись в канал не запускает программу слушания. Если Вы хотите обработать вход в цикле, необходимо поддерживать программу слушания в рабочем состоянии.

while true; do rot13 <f >decoded-output-$(date +%s.%N); done

Обратите внимание, что все данные, записанные в канал, объединяются, даже если существует несколько записей процессов. Если несколько процессов читают, только один получает данные. Таким образом, канал не может подойти для параллельных ситуаций.

Именованный сокет может обработать параллельные соединения, но это вне возможностей основных сценариев оболочки.

В самом сложном конце масштаба пользовательские файловые системы, который позволяет Вам разработать и смонтировать файловую систему где каждый open, write, и т.д., инициировал функцию в программе. Минимальные инвестиции являются десятками строк нетривиального кодирования, например, в Python. Если Вы только хотите выполнить команды при чтении файлов, можно использовать scriptfs или fuseflt.

17
27.01.2020, 19:46

То, что Вы описываете, является по существу FIFO специальный файл, посмотрите fifo(7). Они создаются mkfifo(1), и процесс может затем открыть их в соответствии с Linux для R/W (не весь системный дескриптор Unixy это). Два независимых процесса могут затем использовать его для передачи.

1
27.01.2020, 19:46
[116169]некоторые вещи, о которых следует знать относительно именованных труб: В отличие от файла, канал не может иметь несколько читателей. Как только его содержимое прочитано, оно исчезает. Поэтому нужно зацикливаться, т.е. постоянно проталкивать содержимое в трубу от автора.[12168]Я сам искал ответ на этот вопрос, и единственное, что мне удалось придумать - это [116707]scriptfs[116708], который основан на [116709]fuse[116710].[116172].
3
27.01.2020, 19:46

Самый простой способ «Создать виртуальный файл, который на самом деле является командой» — это расширить файловую систему FUSE. Это очень легко сделать с помощью таких библиотек, как fusepy.

Вот пример файловой системы FUSE, которая позволяет вам читать файлы HTTP/HTTPS/FTP, как если бы они присутствовали на вашем компьютере с Linux. Точно так же вы можете создать что-то, что запускает любую команду для того же при чтении.

Если вы посмотрите на исходный код , вы вряд ли найдете 50 строк кода (, не считая шаблонного кода ).

1
27.01.2020, 19:46

Вопрос неоднозначный. stdin/stdout — это каналы/потоки. Файл является произвольным доступом. Другими словами, при доступе к файлу будут задействованы смещения, и нет возможности передать их команде через stdin/stdout.

Если вы действительно хотите поведение канала/потока без адресов, используйте именованные каналы или аналогично настройте виртуальные терминалы (pty ), например, используя «socat». затем ваша команда слушает и отвечает на другом конце. Но тогда все, что обращается к файлу, должно делать это как последовательное устройство. Я не уверен, как к любому пути к файлу в Linux можно просто получить доступ «как к потоку / каналу». Например, команда «cat» на самом деле программно откроет файл, но не уверен в специфике, но я не думаю, что она откроет его так же, как любой обычный файл файловой системы, поскольку в этом случае будут задействованы адреса.

Если вам нужен произвольный доступ, изучите фьюзы NBD, NBDkit, libFUSE, BUSE, scriptfs, python -.

-1
12.09.2021, 20:36

Теги

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