`test`と` [`-異なるバイナリ、違いはありますか?


13

私は別の質問に答えているときに気付いたのですがtest、それ[は異なるバイナリですが、[マンページにはがありtestます。終了の要件に加えて、]違いはありますか?そうでない場合、なぜシンボリックリンクではなくバイナリを分離するのですか?(これらもbashビルトインでありbash、違いもありません。)

回答:


4

ソースコードは、それがどのように処理するかであるとして違いを説明して--helpオプションを選択します。

  /* Recognize --help or --version, but only when invoked in the
     "[" form, when the last argument is not "]".  Use direct
     parsing, rather than parse_long_options, to avoid accepting
     abbreviations.  POSIX allows "[ --help" and "[ --version" to
     have the usual GNU behavior, but it requires "test --help"
     and "test --version" to exit silently with status 0.  */

デモンストレーション

$ /usr/bin/test --help
$
$ /usr/bin/[ --help
Usage: test EXPRESSION
  or:  test
  or:  [ EXPRESSION ]
  or:  [ ]
  or:  [ OPTION
Exit with the status determined by EXPRESSION.
[...]

あなたが言ったように、bash組み込みバージョンでは、唯一の違いは最後に[必要な]ことです。


1
興味深いことに、ほとんどのプログラムはシンボリックリンクで同じ動作を実現します。
ケビン

1
それらは私のシステム上の同じiノードへのハードリンクです。シンボリックリンクに対するこの利点は、シンボリックリンクのターゲットが削除または移動されると、シンボリックリンクが機能しなくなることです。iノードへのハードリンクの1つが移動または削除されても、すべてのハードリンクは引き続き機能します。
アンドリューメディコ14年

5

通常、これらはハードリンクを含む同じバイナリです。シェルによっては、バイナリではなく内部実装を使用しtest[テストする場合があります。これは、プロセスの生成に関してより効率的であり、バイナリプログラムが提供するものとは異なるオプションを提供する場合がありtestます。

呼び出し形式の違いを除き、どちらも同じ機能を提供します。


7
驚いたことに、Debianのcoreutilsでは、それらは同じバイナリではありません。同じソースが2回コンパイルされます。1つはPROGRAM_NAMEを "test"として定義し、もう1つは "["として定義し、式が "]"で終了することをテストするための追加コードを追加します。o_O-
アンガス

3
@angusこれの別の例は、ls / dir / vdirです。Coreutilsは、実行時にargv [0]をテストするのではなく、異なるハードコーディングされたバイナリをビルドすることを好むようです。
Random832
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.