`test` dan` [`- binari yang berbeda, bedanya?

13

Saya perhatikan ketika menjawab pertanyaan lain itu testdan [biner yang berbeda, tetapi halaman [manualnya naik test. Selain persyaratan akhir ], apakah ada perbedaan? Jika tidak, mengapa mereka memisahkan biner alih-alih disinkronkan? (Mereka juga bashbuiltin, dan bashjuga tidak menunjukkan perbedaan.)

Kevin
sumber

Jawaban:

4

The kode sumber menjelaskan perbedaan sebagai bagaimana menangani --helppilihan.

  /* 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.  */

Peragaan

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

Dalam bashversi bawaan, satu-satunya perbedaan adalah yang [membutuhkan ]di akhir, seperti yang Anda katakan.

Mikel
sumber
1
Menarik, meskipun sebagian besar program mencapai perilaku yang sama dengan symlink.
Kevin
1
Itu adalah hardlink ke inode yang sama pada sistem saya. Keuntungan dari symlink ini adalah bahwa jika target symlink dihapus atau dipindahkan, symlink tidak lagi berfungsi. Jika salah satu hardlink ke inode dipindahkan atau dihapus, semua hardlink akan tetap berfungsi.
Andrew Medico
5

Biasanya, mereka adalah biner yang sama dengan tautan keras. Tergantung pada shell, implementasi internal dapat digunakan untuk testdan [menguji daripada biner. Ini lebih efisien dalam hal proses pemijahan, dan dapat memberikan opsi yang berbeda dari yang testdisediakan oleh program biner .

Selain perbedaan dalam format panggilan, keduanya menyediakan fungsi yang sama.

BillThor
sumber
7
Cukup mengherankan, dalam coreutils Debian mereka bukan biner yang sama. Sumber yang sama dikompilasi dua kali, satu mendefinisikan PROGRAM_NAME sebagai "test", dan lainnya mendefinisikannya sebagai "[" dan dengan beberapa kode tambahan untuk menguji bahwa ekspresi diakhiri dengan "]". o_O
angus
3
@angus Contoh lain dari ini adalah ls / dir / vdir. Coreutils tampaknya lebih suka membangun binari hardcoded yang berbeda daripada menguji argv [0] saat runtime.
Random832