Jaka jest różnica między: a prawdą?

15

W bash:

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

Wygląda na to, że są takie same, ale nie dają tego samego śladu systemowego:

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

Próbowałem diffing strace bash -c : 2>:.txta strace bash -c true 2>true.txt, ale nie można znaleźć żadnych różnic między nimi, z wyjątkiem miejsc pamięci.

W dash:

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

OK, więc nie są takie same. help :i help truenie są bardzo przydatne, i zwracają to samo w bashi dash. Czy jest jakaś praktyczna różnica między nimi, z wyjątkiem tego, że :oszczędza trzy bajty i sprawia, że ​​skrypty są mniej czytelne?

l0b0
źródło

Odpowiedzi:

27

Nie ma prawdziwej różnicy w zachowaniu. Oba polecenia nic nie robią i kończą się powodzeniem. :podkreśla, że ​​nie należy nic robić; truepodkreśla pomyślny status.

strace truedziała, ponieważ truejest zarówno wbudowany w powłokę, jak i zewnętrzne polecenie ( /bin/true); :jest tylko wbudowaną powłoką (nie ma /bin/:- choć może być i prawdopodobnie był na bardzo starych systemach uniksowych). W bash spróbuj

type -a :
type -a true

Powody, dla których oba istnieją, są historyczne. Jeśli dobrze pamiętam, niektóre bardzo wczesne powłoki nie miały składni komentarza, więc :zamiast tego użyto polecenia do-nic .

Istnieje pewna różnica wewnętrzna w dash. Przeglądając źródło, dostępne na git: //git.kernel.org/pub/scm/utils/dash/dash.git, pokazuje kilka różnych ścieżek kodu eval.c, ale nie byłem w stanie stworzyć widocznie różnych zachowań innych niż słowo specialw wynikach type :.

Keith Thompson
źródło
8
Ponadto wczesne wersje systemu UNIX nie miały /bin/truelub /bin/false. Również :komenda jest czasem wykorzystywane do efektów ubocznych przetwarzania argumentów: : ${num_times:=10}.
Arcege
5
:był pierwotnie wskaźnikiem etykiety , pochodzącym od przodka powłoki Bourne'a, który miał goto. Najwyraźniej :został wykorzystany jako wskaźnik komentarza i utknął.
Gilles „SO- przestań być zły”
1
Zachowanie się :jako wskaźnika etykiety dla goto zostało zachowane w klonie pseudo-unixowego wiersza poleceń Microsoftu command.comi pozostaje w jego następcy cmd.exe, podobnie jak praktyka nadużywania ::komentarza do linii.
Sorpigal
8

Są identyczne w Bash. Spójrz na builtins/colon.defkod źródłowy Bash-4.2.

W twoim poleceniu strace truefaktycznie uruchamiasz plik binarny /bin/truezamiast wbudowanego bash true.

Jodie C.
źródło