終了状態が0(成功)になるのはなぜですかfile xxx.src
?cannot open `xxx.src' (No such file or directory)
$ file xxx.src ; echo $?
xxx.src: cannot open `xxx.src' (No such file or directory)
0
注ls
:比較:
$ ls xxx.src ; echo $?
ls: cannot access 'xxx.src': No such file or directory
2
答え1
表面的な答えは、常にそうだったので、誰もがそうするということです。POSIX指摘
fileオペランドと呼ばれるファイルが存在しないか、読み取れない、またはfileオペランドと呼ばれるファイルの種類を決定できない場合、これは終了ステータスに影響を与えるエラーと見なすべきではありません。
残念ながら、何の理由も示されていないので、POSIXがこれを言及する唯一の明白な理由は歴史的慣行です。
このfile
ユーティリティは以下から初めて登場しました。Unixの研究バージョン41973年。その時点で、標準ユーティリティはエラーを確認しませんでした(少なくともその時点からプロセスが戻り状態であったにもかかわらず)。バージョン3バージョン2以外の場合)。たとえば、cat
ファイルが存在しない場合、ゼロ以外の状態の戻りを開始します。バージョン8:バージョン7エラーメッセージを印刷して続行します。でも通り過ぎてもバージョン10、file
ファイルが読み取れない場合にのみゼロ以外の状態で終了しますが、magic
データファイルを読み取れない場合は終了しません。
失敗しない1つの考えられる理由file
は、ファイルの内容だけでなくファイルの種類にも興味があり、「存在しない」をディレクトリ、シンボリックリンク、破損したシンボリックリンクと共に特別な種類のファイルと見なすことです。読めないファイルは実際には特別な種類のファイルではないため、弱い主張です。これは定義できない性格のファイルであり、これは合理的な措置による間違いです。また、適用でき、ls
存在しないファイル名が与えられても、エラーは返されません。バージョン10からしかし、これは最終的に一般的な慣行となりました。
だから返品状態file
は時間が過ぎて忘れられたバグのようです。ファイルが存在しないときにエラー状態を返さないことに依存するいくつかのスクリプトがあるかもしれませんfile
。
答え2
この動作は Linux で文書化されており、POSIX 標準で必要です。file
Ubuntuシステムマニュアルから:
EXIT STATUS
file will exit with 0 if the operation was successful or >0 if an error was encoun‐
tered. The following errors cause diagnostic messages, but don't affect the pro‐
gram exit code (as POSIX requires), unless -E is specified:
• A file cannot be found
• There is no permission to read a file
• The file type cannot be determined
-E
(上記のように):
$ file -E saonteuh; echo $?
saonteuh: ERROR: cannot stat `saonteuh' (No such file or directory)
1
Linuxの非標準オプションは、次-E
のように文書化されています。
ファイルシステムエラー(ファイルが見つからないなど)の場合は、エラーを通常の出力として処理し、POSIXが要求したように続行するのではなく、エラーメッセージをエクスポートして終了します。
file
このユーティリティのPOSIX仕様(私が強調したもの)は次のとおりです。
オペランドと呼ばれるファイルが
file
存在しない、読み取れない、またはファイルオペランドと呼ばれるファイル形式を決定できない場合、これは終了ステータスに影響を与えるエラーと見なすべきではありません。。
答え3
ファイルのマニュアルページには、「ファイルが存在しない、読み取れない、またはそのファイルの状態を確認できない場合、終了ステータスに影響を与えるエラーとは見なされません。出力にファイルが処理されたと表示されますが、フォーマットは切り捨てられません」