"test" ve "[" - farklı ikili dosyalar, herhangi bir fark var mı?


14

Farklı bir ikili soru olan testve başka bir soruyu cevaplarken fark ettim [, ama [manpage yukarı çekiyor test. Bir sonlandırma gerekliliğinin yanı sıra, ]herhangi bir fark var mı? Değilse, neden sembolik bağlanmak yerine ikili dosyaları ayırıyorlar? (Onlar da bashyerleşiktir ve bashhiçbir fark göstermezler.)

Yanıtlar:


6

Kaynak kodu bu nasıl işleyeceğini olarak farkını açıklıyor --helpseçeneği.

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

Sergileme

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

In bashyerleşik sürümü, tek fark olduğunu [gerektirir ]dediğin gibi, sonunda.


1
İlginçtir, ancak çoğu program bir symlink ile aynı davranışı sağlar.
Kevin

2
Onlar benim sistemimdeki aynı inode için hardlinks. Bunun sembolik bağlantıların yararı, sembolik hedef kaldırılırsa veya taşınırsa sembolik bağlantının artık çalışmaz olmasıdır. Bir inode sabit bağlantılarından biri taşınır veya çıkarılırsa, tüm sabit bağlantılar çalışmaya devam eder.
kimse

6

Normalde, sabit bağlantılar ile aynı ikili. Kabuğa bağlı olarak , ikili uygulama yerine dahili bir uygulama testve [testler kullanılabilir . Bu süreç yumurtlama açısından daha etkilidir ve ikili programdan farklı seçenekler sunabilir test.

Çağrı biçimindeki farklılıklar dışında, her ikisi de aynı işlevselliği sağlar.


8
Şaşırtıcı derecede, Debian'ın çekirdeklerinde aynı ikili değiller. Aynı kaynak iki kez derlenir, biri PROGRAM_NAME'yi "test" olarak, diğeri ise "[" olarak ve ifadenin "]" ile bitip bitmediğini test etmek için bazı ek kodlarla tanımlanır. o_O
angus

3
@angus Buna başka bir örnek ls / dir / vdir. Coreutils, çalışma zamanında argv [0] test etmek yerine farklı sabit kodlanmış ikili dosyalar oluşturmayı seviyor gibi görünüyor.
Random832
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.