AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 446237
Accepted
Harold Fischer
Harold Fischer
Asked: 2018-05-27 16:55:14 +0800 CST2018-05-27 16:55:14 +0800 CST 2018-05-27 16:55:14 +0800 CST

文件必须满足哪些条件才能成为 POSIX 定义的文本文件?

  • 772

POSIX 将文本文件定义为:

包含组织成零行或多行的字符的文件。这些行不包含 NUL 字符,长度不能超过 {LINE_MAX} 个字节,包括 <newline> 字符。尽管 POSIX.1-2017 不区分文本文件和二进制文件(参见 ISO C 标准),但许多实用程序仅在对文本文件进行操作时产生可预测或有意义的输出。具有此类限制的标准实用程序始终在其 STDIN 或 INPUT FILES 部分中指定“文本文件”。

来源: http: //pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_403

但是,我发现有几件事不清楚:

  1. 文本文件必须是常规文件吗?在上面的摘录中,它没有明确说明文件必须是常规文件

  2. 如果一个文件仅包含一个字符和一个字符(即,一个不以换行符终止的单个字符),是否可以将文件视为文本文件?我知道这个问题可能听起来很挑剔,但他们使用“字符”一词而不是“一个或多个字符”。其他人可能不同意,但如果他们的意思是“一个或多个字符”,我认为他们应该明确地说出来

  3. 在上面的摘录中,它提到了“行”。我找到了四个名称中带有 line 的定义:“Empty Line”、“Display Line”、“Incomplete Line”和“Line”。我是否应该推断它们的意思是“线”,因为它们省略了“空”、“显示”和“不完整”——或者所有这四个定义都包含在上面的摘录中被视为一条线?

此文本块之后出现的所有问题都取决于推断“字符”表示“一个或多个字符”:

  1. 我可以安全地推断,如果文件为空,则它不是文本文件,因为它不包含一个或多个字符?

此文本块之后出现的所有问题都取决于推断在上述摘录中,一行被定义为“行”,并且应排除名称中包含“行”的其他三个定义:

  1. “零或多行”中的“零”是否意味着如果文件包含一个或多个不以换行符终止的字符,它仍然可以被视为文本文件?

  2. “零行或多行”是否意味着一旦单个“行”(0个或多个字符加上终止换行符)起作用,最后一行成为“不完整行”(一个或多个非文件末尾的换行符)?

  3. “none [no line] 的长度是否可以超过 {LINE_MAX} 个字节,包括换行符”是否意味着文本文件中任何给定“行”中允许的字符数有限制(顺便说一句,值Ubuntu 18.04 和 FreeBSD 11.1 上的 LINE_MAX 是“2048”)?

files posix
  • 2 2 个回答
  • 3190 Views

2 个回答

  • Voted
  1. Best Answer
    Michael Homer
    2018-05-27T17:22:51+08:002018-05-27T17:22:51+08:00
    1. 文本文件必须是常规文件吗?在上面的摘录中,它没有明确说明文件必须是常规文件

      不; 该摘录甚至特别指出标准输入是一个潜在的文本文件。其他标准实用程序,例如 make,专门将字符特殊文件 /dev/null 用作文本文件。

    2. 如果一个文件仅包含一个字符和一个字符(即,一个不以换行符终止的单个字符),是否可以将文件视为文本文件?

      该字符必须是 <newline>,或者这不是line,因此它所在的文件不是文本文件。恰好包含字节 0A 的文件是单行文本文件。空行是有效行。

    3. 在上面的摘录中,它提到了“行”。我找到了四个名称中带有 line 的定义:“Empty Line”、“Display Line”、“Incomplete Line”和“Line”。我是否应该推断它们的意思是“线”,因为它们省略了“空”、“显示”和“不完整”

      这不是一个真正的推论,它只是它所说的。“线”这个词已经给出了一个适合上下文的定义,所以这就是它所说的。

    4. 我可以安全地推断,如果文件为空,则它不是文本文件,因为它不包含一个或多个字符?

      一个空文件由零(或更多)行组成,因此是一个文本文件。

    5. “零或多行”中的“零”是否意味着如果文件包含一个或多个不以换行符终止的字符,它仍然可以被视为文本文件?

      不,这些字符没有组织成行。

    6. “零行或多行”是否意味着一旦单个“行”(0个或多个字符加上终止换行符)起作用,最后一行成为“不完整行”(一个或多个非文件末尾的换行符)?

      这不是非法的,它只是不是一个文本文件。需要向其提供文本文件的实用程序如果改为提供该文件,则可能会产生不利的行为。

    7. “无 [无行] 长度可以超过 {LINE_MAX} 个字节,包括换行符”是否意味着文本文件中任何给定“行”中允许的字符数有限制

      是的。

    这个定义只是试图为基于文本的实用程序(例如grep)肯定会接受的内容设置一些界限——仅此而已。他们也可以更自由地接受事物,而且在实践中也经常这样做。他们被允许使用固定大小的缓冲区来处理一行,假设一个换行符在它满之前出现,等等。你可能读得太多了。

    • 30
  2. user232326
    2018-05-27T17:23:35+08:002018-05-27T17:23:35+08:00
    锁定。对此答案的评论已被禁用,但它仍在接受其他交互。了解更多。

    正如 POSIX 所定义的:

    是的,一个文本文件(基本上)是:

    包含组织成零行或多行的字符的文件。

    还包括以下定义会很有用:

    3.92 字符串

    由第一个空字节终止并包括第一个空字节的连续字符序列。

    3.195 不完整线

    文件末尾的一个或多个非 <newline> 字符序列。

    3.206线

    零个或多个非 <newline> 字符加上终止 <newline> 字符的序列。

    3.243 换行符 (<newline>)

    输出流中的一个字符表示打印应该从下一行的开头开始。它是C语言中'\n'指定的字符。未指定此字符是否是系统传输到输出设备以完成移动到下一行的确切序列。

    3.247 无

    所有位都设置为零的字符。

    请注意,“文本文件”不应包含NUL 字节。


    所以:

    1. 文本文件必须是常规文件吗?
      不,它不需要。“文本文件”是根据读取时包含的内容来定义的。如果文件包含“零行或多行”,则它是文本文件。/dev/stdin如果一次读取而不是在下次读取时,某些文件(如)可能包含文本文件。
    2. 如果一个文件只包含一个字符和一个字符,是否可以将其视为文本文件……?
      不,那是一条不完整的线(3.195)。
      文本文件应该只有非“不完整的行”。
    3. 我是否应该推断它们的意思是“线”……?
      是的你应该。
    4. 我可以安全地推断如果文件为空,则它不是文本文件……?
      不,空文件(零字符)是有效的“文本文件”。
      从上面:…零或多行…。零行(零字符)是有效的“文本文件”。
    5. ... 如果它包含一个或多个不以换行符终止的字符,则认为它是一个文本文件?
      不,不是(技术上)有效的“行”中的“不完整行”。
    6. “零或多行”中的“零”是否意味着如果文件包含一个或多个不以换行符终止的字符,它仍然可以被视为文本文件?
      不,不完整的线不是“线”。文本文件不应有不完整的行。

    7. ……文本文件中任何给定“行”中允许的字符数有限制……?
      是的,在有效“文本文件”的任何给定行中不得超过 {LINE_MAX}个字节(与字符相反)。
      {LINE_MAX} 的值在文件 <limits.h>
      中给出 (也可以阅读Sensible line buffer size in C?):

      {LINE_MAX}
      除非另有说明,否则当实用程序被描述为处理文本文件时,实用程序的输入行(标准输入或其他文件)的最大长度(以字节为单位)。长度包括尾随的空间。
      可接受的最小值:{_POSIX2_LINE_MAX}

      对于基于 GNU 的系统,没有设定限制(内存除外):

      宏:int LINE_MAX
      面向文本的 POSIX.2 实用程序可以支持的最大文本行。(如果您使用这些实用程序的 GNU 版本,那么除了可用虚拟内存施加的限制外,没有实际限制,但库无法告诉您这一点。)

      它似乎被定义 posix_lim.h为 2048(至少对于 64 位 linux GNU 系统):

      $ grep -ri 'POSIX2_LINE_MAX' /usr/include/ 
      
      /usr/include/x86_64-linux-gnu/bits/xopen_lim.h:#define NL_LANGMAX       _POSIX2_LINE_MAX
      /usr/include/x86_64-linux-gnu/bits/posix2_lim.h:#define _POSIX2_LINE_MAX                2048
      /usr/include/x86_64-linux-gnu/bits/posix2_lim.h:#define LINE_MAX                _POSIX2_LINE_MAX
      

      也可以使用 POSIX实用程序 getconf找到它:

      $ getconf LINE_MAX
      2048
      

    相关: 为什么文本文件应该以换行符结尾?

    • 8

相关问题

  • 列出根据特定内容行排序的文件

  • 如何提前知道 .zip 内部是否有父目录

  • 当会话负责人退出时,unix 会话会发生什么?

  • 如何找到特定的文件类型并将它们 tar?

  • du/df 和 ls 报告不同的磁盘使用情况

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve