`ทดสอบ 'และ` [' - ไบนารีต่างกันมีความแตกต่างกันอย่างไร


13

ผมสังเกตเห็นในขณะที่ตอบคำถามที่ว่าคนอื่นtestและ[เป็นไบนารีแตกต่างกัน แต่[manpage ดึงขึ้น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
ที่น่าสนใจแม้ว่าโปรแกรมส่วนใหญ่จะมีพฤติกรรมเดียวกันกับ symlink
เควิน

1
พวกมันเชื่อมโยงไปยัง inode เดียวกันบนระบบของฉัน ประโยชน์ของการใช้ symlink นี้คือถ้าเป้าหมาย symlink ถูกลบหรือย้าย symlink จะไม่ทำงานอีกต่อไป หากหนึ่งในลิงก์ไปยัง inode ถูกย้ายหรือลบออกฮาร์ดลิงก์ทั้งหมดจะยังคงทำงานต่อไป
ไม่มีใคร

5

โดยปกติมันเป็นไบนารีเดียวกันกับฮาร์ดลิงก์ ขึ้นอยู่กับเชลล์การใช้งานภายในอาจใช้สำหรับtestและ[ทดสอบแทนไบนารี นี้จะมีประสิทธิภาพมากขึ้นในแง่ของกระบวนการวางไข่และอาจมีตัวเลือกที่แตกต่างจากโปรแกรมไบนารีtestให้

นอกเหนือจากความแตกต่างในรูปแบบการโทรแล้วทั้งคู่ยังมีฟังก์ชันการทำงานเดียวกัน


7
น่าอัศจรรย์เพียงพอใน coreutils ของ Debian พวกมันไม่ใช่เลขฐานสองเดียวกัน แหล่งที่มาเดียวกันถูกคอมไพล์สองครั้งหนึ่งกำหนด PROGRAM_NAME เป็น "ทดสอบ" และอื่น ๆ ที่กำหนดเป็น "[" และมีรหัสเพิ่มเติมบางอย่างเพื่อทดสอบว่านิพจน์ลงท้ายด้วย "]" o_O
angus

3
@angus ตัวอย่างอื่น ๆ ของนี้คือ ls / dir / vdir Coreutils ดูเหมือนว่าจะสร้างไบนารีที่แตกต่างกันมากกว่าที่จะทดสอบ argv [0] ที่รันไทม์
Random832
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.