11

私のスクリプトからASCII NULを除外するのは、bashとdashのようです。

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

NUL を使用するのは悪い考えであることに同意しますが (たとえば、プログラムへの引数の受け渡しは NUL で終了する文字列で機能します)、この動作がPOSIX 標準によって認可されている場所がわかりません。

この動作がファイルの構文の正しさを決定している場合、さらに悪化します。

$ 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
\

私が見逃した重要な部分は何ですか、それとも NUL の削除は、不特定の動作に対処する方法についての決定にすぎませんか?

4

1 に答える 1

6

shの標準の INPUT FILES セクションには、次のように記載されています。

入力ファイルは、行の長さが無制限であることを除いて、テキスト ファイルでなければなりません。入力ファイルが空であるか、空白行またはコメントのみ、またはその両方で構成されている場合、sh は終了ステータス 0 で終了します。

「テキスト ファイル」という用語は、セクション 3.395 で次のように定義されいます。

0 行以上に編成された文字を含むファイル。行には NUL 文字が含まれておらず、<newline> 文字を含めて長さが {LINE_MAX} バイトを超えることはできません。POSIX.1-2008 はテキスト ファイルとバイナリ ファイルを区別しませんが (ISO C 標準を参照)、多くのユーティリティは、テキスト ファイルを操作するときに予測可能な出力または意味のある出力しか生成しません。このような制限がある標準ユーティリティは、STDIN または INPUT FILES セクションで常に「テキスト ファイル」を指定します。

入力がテキスト ファイルでない場合 (含まれるバイト数が 0 の場合はそうではありません)、動作は意味がなく、予測できません。

于 2012-08-09T14:09:20.993 に答える