Lê todo o arquivo na memória?

5

Existe alguma maneira de ler o arquivo inteiro na memória no bash, sem usar o comando externo como cat ?

Eu sei a sintaxe para obter a saída de um arquivo, ou seja, <(/bin/ls) , mas agora preciso ler o arquivo na memória inteira, ou seja, $A manteria o conteúdo (e poderia haver nulo, EOF como material)

    
por daisy 04.12.2012 / 02:40

2 respostas

7

O Bash não suporta bytes nulos em variáveis. foo=$(cat file) faz com que $foo contenha o início do arquivo, até o primeiro byte nulo. A substituição de comando também remove todas as novas linhas finais do arquivo. Por exemplo, se o arquivo consistir em quatro bytes ( a , nova linha, nova linha, nova linha), então foo conterá apenas a , o mesmo que se o arquivo contivesse apenas esse byte.

Se você quiser preservar as novas linhas finais, providencie para que o comando imprima um caractere extra de não-nova linha e, em seguida, retire-o.

foo=$(cat file; echo a)
foo=${foo%a}

Até agora, tudo isso funcionou em todos os shells do estilo Bourne / POSIX (ash, ksh, bash,…). O Bash ≥4.0 tem uma maneira mais rápida de ler um arquivo em uma variável: o mapfile .

mapfile <file foo

Simplesmente não há como inserir um byte nulo em uma variável bash. Se você quiser isso, você tem várias opções:

  • Use zsh.
  • Use Perl.
  • Armazene os dados em um arquivo temporário (que parece inútil aqui, pois os dados já estão em um arquivo).
  • Codifique a entrada e decodifique-a de volta, por exemplo com base64 e base64 -d .
por 05.12.2012 / 01:42
6

Uma maneira como esta:

$ A=$(<file)

Em vez de uma variável, uma opção melhor seria ler em uma matriz que facilita o acesso a linhas diferentes:

$ OIFS=$IFS
$ IFS=$'\n'
$ arr=($(<file))
$ IFS=$OIFS
    
por 04.12.2012 / 02:49

Tags