Intereting Posts

Возможно ли создать «файл», который может быть использован любым процессом без фактического сохранения файла на диске?

Предположим, что я делаю grep что дает мне много результатов. Я хочу использовать вывод grep и передать его команде, которая принимает имя файла, поскольку это первый аргумент. Например –

 myCommand filename.txt 

Я хотел бы сделать что-то вроде этого –

 grep "xyz" | myCommand 

Однако, поскольку myCommand не читает stdin, этот трубопровод не работает. Я не хочу создавать временный файл на диске с результатами grep. Возможно ли любым другим способом создать «файл», скажем в памяти, и позволить myCommand использовать это?

Простое решение – использовать поддержку Bash для замещения процесса, например:

 myCommand <(grep "xyz" somefile) 

Это приведет к подключению вывода команды grep к файловому дескриптору, а затем передайте /dev/fd/NNN (где NNN – номер fd) в вашу команду в качестве входного файла (например, ваша команда может фактически запускаться как myCommand /dev/fd/63 ). Это решение не создает временный файл.

Вы также можете создать именованный канал и использовать его для переноса данных:

 $ mkfifo /tmp/myfifo $ grep "xyz somefile > /tmp/myfifo & $ myCommand /tmp/myfifo 

Но на самом деле первое решение проще.

Стефан Хазелас комментирует:

zsh также имеет myCommand = (grep xyz somefile), который использует обычный временный файл (для случаев, когда myCommand не может принять канал).

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

Большинство дистрибутивов теперь содержат RAM-диск для этой цели. Вы можете записывать файлы на него, как обычно, его обычно называют /dev/shm . Вы можете проверить, есть ли у вас это так:

 $ mount |grep shm tmpfs on /dev/shm type tmpfs (rw) 

Если у вас есть это, вы можете написать ему, как и любую другую файловую систему:

 $ echo "hello world" > /dev/shm/somefile.txt 

И посмотрите, используя обычные инструменты:

 $ ls -l /dev/shm/ total 680 -r-------- 1 saml saml 67108904 Jul 22 20:55 pulse-shm-3981461026 -r-------- 1 saml saml 67108904 Jul 18 18:06 pulse-shm-799251885 -rw-rw-r-- 1 saml saml 12 Jul 24 10:59 somefile.txt 

Однако это не требует реального дискового пространства, оно использует оперативную память.