`test` e` [`- binari diversi, qualche differenza?


13

Ho notato mentre rispondevo a un'altra domanda teste [sono binari diversi, ma la [manpage si alza test. Oltre al requisito per un finale ], c'è qualche differenza? In caso contrario, perché sono binari separati invece di essere collegati simbolicamente? (Sono anche bashincorporati e bashnon mostrano alcuna differenza.)

Risposte:


4

Il codice sorgente spiega la differenza nel modo in cui gestisce l' --helpopzione.

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

dimostrando

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

Nella bashversione integrata, l'unica differenza è che [richiede ]alla fine, come hai detto.


1
Interessante, sebbene la maggior parte dei programmi raggiunga lo stesso comportamento con un collegamento simbolico.
Kevin,

1
Sono collegamenti diretti allo stesso inode sul mio sistema. Il vantaggio di questo sui collegamenti simbolici è che se la destinazione del collegamento simbolico viene rimossa o spostata, il collegamento simbolico non funziona più. Se uno degli hardlink di un inode viene spostato o rimosso, tutti gli hardlink continuano a funzionare.
Andrew Medico,

5

Normalmente, sono lo stesso binario con hard link. A seconda della shell, è possibile utilizzare un'implementazione interna teste [test anziché il binario. Ciò è più efficiente in termini di generazione del processo e può fornire opzioni diverse rispetto a quelle testfornite dal programma binario .

Oltre alle differenze nel formato delle chiamate, offrono entrambe la stessa funzionalità.


7
Abbastanza sorprendentemente, nei coreutil di Debian non sono lo stesso binario. La stessa fonte viene compilata due volte, una che definisce PROGRAM_NAME come "test" e l'altra che lo definisce come "[" e con un codice aggiuntivo per verificare che l'espressione termina con "]". o_O
angus

3
@angus Un altro esempio di questo è ls / dir / vdir. A Coreutils sembra piacere costruire diversi binari hardcoded piuttosto che testare argv [0] in fase di runtime.
Casuale 832
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.