文件必須滿足哪些條件才能成為 POSIX 定義的文本文件?
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
但是,我發現有幾件事不清楚:
- 文本文件必須是正常文件嗎?在上面的摘錄中,它沒有明確說明文件必須是正常文件
- 如果一個文件僅包含一個字元和一個字元(即,一個不以換行符終止的單個字元),是否可以將文件視為文本文件?我知道這個問題可能聽起來很挑剔,但他們使用“字元”一詞而不是“一個或多個字元”。其他人可能不同意,但如果他們的意思是“一個或多個字元”,我認為他們應該明確地說出來
- 在上面的摘錄中,它提到了“行”。我找到了四個名稱中帶有 line 的定義:“Empty Line”、“Display Line”、“Incomplete Line”和“Line”。我是否應該推斷它們的意思是“線”,因為它們省略了“空”、“顯示”和“不完整”——或者所有這四個定義都包含在上面的摘錄中被視為一條線?
此文本塊之後出現的所有問題都取決於推斷“字元”表示“一個或多個字元”:
- 我可以安全地推斷,如果文件為空,則它不是文本文件,因為它不包含一個或多個字元?
此文本塊之後出現的所有問題都取決於推斷在上述摘錄中,一行被定義為“行”,並且應排除名稱中包含“行”的其他三個定義:
- “零或多行”中的“零”是否意味著如果文件包含一個或多個不以換行符終止的字元,它仍然可以被視為文本文件?
- “零行或多行”是否意味著一旦單個“行”(0個或多個字元加上終止換行符)起作用,最後一行成為“不完整行”(一個或多個非文件末尾的換行符)?
- 是否“無
$$ no line $$長度可以超過 {LINE_MAX} 個字節,包括換行符”表示文本文件中任何給定“行”中允許的字元數有限制(順便說一下,Ubuntu 18.04 和 FreeBSD 11.1 上的 LINE_MAX 值是“2048”)?
- >
文本文件必須是正常文件嗎?在上面的摘錄中,它沒有明確說明文件必須是正常文件
不; 該摘錄甚至特別指出標準輸入是一個潛在的文本文件。其他標準實用程序,例如
make
,專門將字元特殊文件/dev/null
用作文本文件。 2. >如果一個文件僅包含一個字元和一個字元(即,一個不以換行符終止的單個字元),是否可以將文件視為文本文件?
該字元必須是 <newline>,或者這不是line,因此它所在的文件不是文本文件。恰好包含字節 0A 的文件是單行文本文件。空行是有效行。 3. >
在上面的摘錄中,它提到了“行”。我找到了四個名稱中帶有 line 的定義:“Empty Line”、“Display Line”、“Incomplete Line”和“Line”。我是否應該推斷它們的意思是“線”,因為它們省略了“空”、“顯示”和“不完整”
這不是一個真正的推論,它只是它所說的。“線”這個詞已經給出了一個適合上下文的定義,所以這就是它所說的。 4. >
我可以安全地推斷,如果文件為空,則它不是文本文件,因為它不包含一個或多個字元?
一個空文件由零(或更多)行組成,因此是一個文本文件。 5. >
“零或多行”中的“零”是否意味著如果文件包含一個或多個不以換行符終止的字元,它仍然可以被視為文本文件?
不,這些字元沒有組織成行。 6. >
“零行或多行”是否意味著一旦單個“行”(0個或多個字元加上終止換行符)起作用,最後一行成為“不完整行”(一個或多個非文件末尾的換行符)?
這不是非法的,它只是不是一個文本文件。需要向其提供文本文件的實用程序如果改為提供該文件,則可能會產生不利的行為。 7. >
是否“無
$$ no line $$長度可以超過 {LINE_MAX} 個字節,包括換行符”表示文本文件中任何給定“行”中允許的字元數有限制
是的。
這個定義只是試圖為基於文本的實用程序(例如
grep
)肯定會接受的內容設置一些界限——僅此而已。他們也可以更自由地接受事物,而且在實踐中也經常這樣做。他們被允許使用固定大小的緩衝區來處理一行,假設一個換行符在它滿之前出現,等等。你可能讀得太多了。