POSIX define um arquivo de texto como:
Um arquivo que contém caracteres organizados em zero ou mais linhas. As linhas não contêm caracteres NUL e nenhuma pode exceder {LINE_MAX} bytes de comprimento, incluindo o caractere <newline>. Embora o POSIX.1-2017 não faça distinção entre arquivos de texto e arquivos binários (consulte o padrão ISO C), muitos utilitários produzem apenas resultados previsíveis ou significativos ao operar em arquivos de texto. Os utilitários padrão que possuem essas restrições sempre especificam "arquivos de texto" nas seções STDIN ou INPUT FILES.
Fonte: http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403
No entanto, há várias coisas que acho incertas:
Um arquivo de texto deve ser regular? No trecho acima, não diz explicitamente que o arquivo deve ser um arquivo regular
Um arquivo pode ser considerado um arquivo de texto se contiver apenas um caractere e um caractere (ou seja, um único caractere que não termine com uma nova linha)? Sei que essa pergunta pode parecer insidiosa, mas eles usam a palavra "caracteres" em vez de "um ou mais caracteres". Outros podem discordar, mas se eles significam "um ou mais caracteres", acho que deveriam dizer isso explicitamente
No trecho acima, ele faz referência a "linhas". Encontrei quatro definições com linhas no nome: "Linha Vazia", "Linha de Exibição", "Linha Incompleta" e "Linha". Devo inferir que eles significam "Linha" devido à omissão de "Vazio", "Exibição" e "Incompleto" - ou todas essas quatro definições são inclusivas como consideradas uma linha no trecho acima?
Todas as perguntas que surgem após esse bloco de texto dependem da dedução de que "caracteres" significa "um ou mais caracteres":
- Posso deduzir com segurança que, se um arquivo está vazio, não é um arquivo de texto porque não contém um ou mais caracteres?
Todas as perguntas que surgem após esse bloco de texto dependem da dedução de que, no trecho acima, uma linha é definida como "Linha" e que as outras três definições que contêm "Linha" em seu nome devem ser excluídas:
O "zero" em "zero ou mais linhas" significa que um arquivo ainda pode ser considerado um arquivo de texto se contiver um ou mais caracteres que não são finalizados com nova linha?
"Zero ou mais linhas" significa que, uma vez que uma única "Linha" (0 ou mais caracteres mais uma nova linha final) entra em jogo, torna-se ilegal que a última linha seja uma "Linha incompleta" (uma ou mais linhas não- caracteres de nova linha no final de um arquivo)?
"Nenhuma [nenhuma linha] pode exceder {LINE_MAX} bytes de comprimento, incluindo o caractere de nova linha" significa que há uma limitação ao número de caracteres permitidos em qualquer "Linha" em um arquivo de texto (como um aparte, o valor de LINE_MAX no Ubuntu 18.04 e FreeBSD 11.1 é "2048")?
Respostas:
Não; o trecho até observa especificamente a entrada padrão como um arquivo de texto em potencial. Outros utilitários padrão, como
make
, especificamente , usam o arquivo especial de caracteres/dev/null
como um arquivo de texto .Esse caractere deve ser um <newline>, ou isso não é uma linha e, portanto, o arquivo em que está não é um arquivo de texto. Um arquivo contendo exatamente o byte 0A é um arquivo de texto de linha única. Uma linha vazia é uma linha válida.
Não é realmente uma inferência, é apenas o que diz. A palavra "linha" recebeu uma definição contextualmente apropriada e é sobre isso que está falando.
Um arquivo vazio consiste em zero (ou mais) linhas e, portanto, é um arquivo de texto.
Não, esses caracteres não estão organizados em linhas.
Não é ilegal , não é apenas um arquivo de texto. Um utilitário que exige que um arquivo de texto seja fornecido a ele pode se comportar adversamente se receber esse arquivo.
Sim.
Essa definição está apenas tentando definir alguns limites sobre o que um utilitário baseado em texto ( por exemplo
grep
) aceitará definitivamente - nada mais. Eles também são livres para aceitar as coisas de maneira mais liberal e, na maioria das vezes, na prática. Eles têm permissão para usar um buffer de tamanho fixo para processar uma linha, assumir que uma nova linha apareça antes de ficar cheia e assim por diante. Você pode estar lendo demais coisas.fonte
printf "a" > file
, criaria um arquivo de texto de acordo com essa definição. Sua resposta para 4 parece contradizer suas respostas para 2 e 5, pois você sugere quetouch file
cria um arquivo de texto enquantoprintf "a" > file
isso não ocorre.(.{0,M}\n)*
(implicitamente ancorada e nas duas extremidades), onde\n
corresponde a uma nova linha e a.
qualquer caractere que não seja uma nova linha eM
é um espaço reservado para o valor numérico LINE_MAX-1. Em particular, isso implica que um arquivo vazio é um arquivo de texto válido que consiste em zero linhas, mas que qualquer arquivo de texto não vazio deve terminar em uma nova linha (pois, caso contrário, conteria uma linha incompleta e uma linha incompleta não é uma linha )/dev/null
é um arquivo vazio. Você está pensando/dev/zero
./dev/null
lê como vazio, pois você não obtém dados quando os lê. Não sei se faz muito sentido considerar arquivos não regulares aqui, pois muitos deles são de natureza dinâmica. Isso inclui tubos, soquetes, dispositivos char, que são basicamente apenas interfaces de transporte para / de alguma outra entidade. Eles não contêm nenhum conjunto estático de dados, portanto, faria mais sentido considerar as propriedades dos dados que foram transferidos, em vez das propriedades do arquivo .Conforme definido pelo POSIX:
Sim, um arquivo de texto é (basicamente):
Seria útil incluir também estas definições:
3.92 Sequência de caracteres
3.195 Linha incompleta
3.206 Linha
3.243 Caractere de nova linha (<nova linha>)
3,247 NUL
Observe que um "arquivo de texto" não deve conter NUL bytes.
Tão:
Não, não precisa ser. Um "arquivo de texto" é definido em termos do que ele contém quando lido. Se um arquivo contiver "zero ou mais linhas", será um arquivo de texto. Alguns arquivos, como
/dev/stdin
, podem conter um arquivo de texto se forem lidos de uma só vez e não na próxima vez que forem lidos.Não, essa é uma linha incompleta (3.195).
Um arquivo de texto deve conter apenas "Linhas incompletas".
Sim você deveria.
Não, um arquivo vazio (zero caracteres) é um "arquivo de texto" válido.
De cima: … zero ou mais linhas… . Zero linhas (zero caracteres) é um "arquivo de texto" válido.
Não, uma "Linha incompleta" não é (tecnicamente) uma "linha" válida.
O "zero" em "zero ou mais linhas" significa que um arquivo ainda pode ser considerado um arquivo de texto se contiver um ou mais caracteres que não são finalizados com nova linha?
Não, uma linha incompleta não é uma "Linha". Um arquivo de texto não deve ter linhas incompletas.
… Existe uma limitação ao número de caracteres permitido em qualquer "Linha" em um arquivo de texto ...?
Sim, não é permitido mais do que {LINE_MAX} bytes (em oposição a caracteres) em qualquer linha de um "arquivo de texto" válido.
O valor de {LINE_MAX} é fornecido no arquivo <limits.h>
(leia também Tamanho sensível do buffer de linha em C? ):
Para um sistema baseado em GNU, não há limite definido (exceto memória) :
Parece ser definido em
posix_lim.h
2048 (pelo menos para sistemas GNU Linux de 64 bits):Também pode ser encontrado usando o utilitário POSIX getconf :
Relacionado: Por que os arquivos de texto devem terminar com uma nova linha?
fonte
file
utilitário relata apenas o tipo de arquivo para arquivos especiais, mas é assim que o utilitário funciona, usafile - <…
ou (Linux)file -s …
para ver suas heurísticas no conteúdo do arquivo para um arquivo especial. Um arquivo especial pode ter conteúdos diferentes cada vez que você o abre, portanto pode ou ser um arquivo de texto a cada vez./dev/null
é sempre um arquivo de texto porque seu conteúdo é sempre um arquivo de texto.grep
em arquivos, você pode usargetconf
para obter valores de conf do sistemagetconf LINE_MAX
, por exemplo , que por sinal retornam 2048 (bytes) no meu sistema (Ubuntu 16.04).getconf
permite ler o valor atual da configuração.