2012-08-07 74 views
11

它看起來像bash,也破折號,從我的腳本中過濾掉任何ASCII NUL。爲什麼所有NUL都從我的腳本中刪除?

$ printf 'test="\000a" ; echo ${#test}' | sh 
1 
$ printf 'test="\001a" ; echo ${#test}' | sh 
2 
$ printf 'ec\000ho test' | sh 
test 
$ # (Same for bash) 

雖然我同意使用NUL是一個壞的壞主意(以傳遞給節目例如參數可與NULL結尾的字符串),我沒有看到這種現象是the POSIX standard制裁。

當這種行爲決定文件的語法正確性時,情況變得更糟。

$ printf 'echo "\\\000"' | sh 
sh: Syntax error: Unterminated quoted string 
$ printf 'echo "\\\000"' | bash 
bash: line 1: unexpected EOF while looking for matching `"' 
bash: line 2: syntax error: unexpected end of file 
$ printf 'echo "\\\134"' | sh 
\ 

我錯過了什麼重要組成部分,或者就是空去除只能在如何與未指定的行爲應付的決定?

+5

我熟悉的所有sh實現都使用C字符串,它們是NUL終止的,它們的性質不能保存NUL值。 – 2012-08-08 00:18:17

+2

zsh很好地處理了所有這些測試用例。 – 2012-08-08 04:50:49

+0

如果@ CharlesDuffy的回答不足,我也會試着詢問Unix和Linux。 – twmb 2012-08-08 07:44:45

回答

6

在標準輸入文件部分,用於sh狀態:

輸入文件應爲一個文本文件,所不同的是線路長度應是無限的。如果輸入文件爲空或僅由空白行或註釋組成,則sh應以零退出狀態退出。

包含組織成零個或多個行字符的文件:

術語「文本文件」被作爲部分3.395 here定義。這些行不包含NUL字符,並且都不能超過{LINE_MAX}個字節,包括<換行符>字符。儘管POSIX.1-2008沒有區分文本文件和二進制文件(請參閱ISO C標準),但許多實用程序僅在文本文件上操作時纔會產生可預測或有意義的輸出。具有此類限制的標準實用程序總是在其STDIN或INPUT FILES部分中指定「文本文件」

如果輸入不是文本文件(如果它不包含零字節,則不是這樣),則該行爲既沒有意義也不可預測。

+0

+1看起來像我在找什麼。這意味着,最好建議在我想的NUL上放棄實現。 – 2012-08-09 16:26:42

相關問題