É possível criar um “arquivo” que possa ser usado por qualquer processo sem realmente salvar o arquivo no disco?

3

Suponha que eu faça um grep que me dê muitos resultados. Eu quero usar a saída do grep e passá-lo para um comando que leva um nome de arquivo como primeiro argumento. Por exemplo -

myCommand filename.txt

Eu gostaria de fazer algo assim -

grep "xyz" | myCommand

No entanto, como myCommand não lê stdin, essa tubulação não funciona. Eu não quero criar um arquivo temporário no disco com os resultados do grep. É possível por qualquer outro meio criar um "arquivo", digamos na memória e deixar myCommand usar isso?

    
por CodeBlue 24.07.2013 / 16:11

2 respostas

5

Uma solução simples é usar o suporte do Bash para substituição de processos, assim:

myCommand <(grep "xyz" somefile)

Isso conectará a saída do comando grep a um descritor de arquivo e, em seguida, transmitirá /dev/fd/NNN (onde NNN é o número fd) ao seu comando como o arquivo de entrada (por exemplo, seu comando pode realmente executado como myCommand /dev/fd/63 ). Esta solução não cria um arquivo temporário.

Você também pode criar um canal nomeado e usá-lo para transferir dados:

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

Mas, na verdade, a primeira solução é mais simples.

Stephane Chazelas comenta:

zsh also has myCommand =(grep xyz somefile) which uses a regular temporary file (for cases where myCommand can't accept a pipe).

Isso é importante porque alguns comandos esperam poder executar acesso aleatório em seu arquivo de entrada, o que não funcionará com um pipe. Usando esta sintaxe, você obtém os benefícios dos arquivos temporários sem precisar se preocupar em limpá-los.

    
por 24.07.2013 / 16:18
2

A maioria das distros agora inclui um disco RAM para esse propósito exato. Você pode gravar arquivos como normal, é normalmente chamado de /dev/shm . Você pode verificar se você tem assim:

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

Se você tiver, você pode escrever para ele como qualquer outro sistema de arquivos:

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

E veja-o usando ferramentas normais:

$ 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

No entanto, isso não consome espaço em disco real, está usando RAM.

    
por 24.07.2013 / 17:00