อะไรคือความแตกต่างระหว่าง: และจริง


15

ในbash:

$ type :
: is a shell builtin
$ type true
true is a shell builtin

ดูเหมือนว่าพวกเขาจะเหมือนกัน แต่พวกเขาไม่ได้ให้ระบบการสืบค้นกลับที่เหมือนกัน:

$ strace :
strace: :: command not found
$ strace true
execve("/bin/true", ["true"], [/* 82 vars */]) = 0
[snip]
exit_group(0)                           = ?

ฉันพยายามทำให้แตกต่างstrace bash -c : 2>:.txtและstrace bash -c true 2>true.txtแต่ไม่พบความแตกต่างระหว่างพวกเขายกเว้นที่ตั้งหน่วยความจำ

ในdash:

$ type :
: is a special shell builtin
$ type true
true is a shell builtin

ตกลงดังนั้นพวกเขาจะไม่เหมือนกัน help :และhelp trueไม่เป็นประโยชน์มากและพวกเขากลับเดียวกันในและbash dashมีความแตกต่างในทางปฏิบัติระหว่างพวกเขายกเว้นว่า:จะบันทึกสามไบต์และทำให้สคริปต์อ่านน้อยลง?


คำตอบ:


27

ไม่มีความแตกต่างในพฤติกรรมที่แท้จริง ทั้งสองคำสั่งไม่ทำอะไรเลยและออกด้วยสถานะที่ประสบความสำเร็จ :เน้นการไม่ทำอะไรเลย trueเน้นสถานะที่ประสบความสำเร็จ

strace trueทำงานได้เพราะtrueทั้งเชลล์ในตัวและคำสั่งภายนอก ( /bin/true); :เป็นเพียงเชลล์บิวด์อิน (ไม่มี/bin/:- แม้ว่าอาจมีได้และอาจเป็นระบบยูนิกซ์ที่เก่ามาก) ลองทุบตี

type -a :
type -a true

เหตุผลที่มีอยู่ทั้งคู่นั้นเป็นเรื่องในอดีต ถ้าฉันจำได้อย่างถูกต้องเปลือกบางต้น ๆ ไม่มีไวยากรณ์ความคิดเห็นดังนั้นจึงใช้:คำสั่งdo-nothing แทน

มีความแตกต่างภายในอยู่dashบ้าง มองผ่านแหล่งที่มีอยู่ที่ git: //git.kernel.org/pub/scm/utils/dash/dash.git แสดงเส้นทางของรหัสที่แตกต่างกันeval.cแต่ฉันไม่สามารถสร้างพฤติกรรมที่แตกต่างอย่างเห็นได้ชัดอื่น ๆ มากกว่าคำว่าในการส่งออกของspecialtype :


8
นอกจากนี้รุ่นแรกของ UNIX ไม่ได้หรือ/bin/true /bin/falseนอกจากนี้ยังมีคำสั่งบางครั้งใช้สำหรับผลข้างเคียงในการประมวลผลอาร์กิวเมนต์:: : ${num_times:=10}
Arcege

5
:คือเดิมเป็นตัวบ่งชี้ที่ป้ายgotoกลับมาในบรรพบุรุษของบอร์นเปลือกที่มี เห็นได้ชัดว่า:ถูกทารุณกรรมเป็นตัวบ่งชี้ความคิดเห็นและติดอยู่
Gilles 'หยุดความชั่วร้าย'

1
พฤติกรรมของการ:เป็นตัวบ่งชี้ฉลากสำหรับข้ามไปนั้นได้รับการเก็บรักษาไว้ในโคลนของบรรทัดคำสั่งหลอกของ Unix ของ Microsoft command.comและยังคงอยู่ในตัวตายตัวแทนของตัวcmd.exeเองเช่นเดียวกับการฝึกเหยียดหยาม::ความคิดเห็นบรรทัด
Sorpigal

8

พวกมันเหมือนกันใน Bash ดูbuiltins/colon.defในซอร์สโค้ด Bash-4.2

ในคำสั่งของstrace trueคุณคุณกำลังทำงานจริงไบนารี/bin/trueแทนการทุบตีในตัวจริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.