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>:.txt
a 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 true
nie są bardzo przydatne, i zwracają to samo w bash
i 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?
Odpowiedzi:
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ć;true
podkreśla pomyślny status.strace true
działa, ponieważtrue
jest 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óbujPowody, 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 kodueval.c
, ale nie byłem w stanie stworzyć widocznie różnych zachowań innych niż słowospecial
w wynikachtype :
.źródło
/bin/true
lub/bin/false
. Również:
komenda jest czasem wykorzystywane do efektów ubocznych przetwarzania argumentów:: ${num_times:=10}
.:
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ął.:
jako wskaźnika etykiety dla goto zostało zachowane w klonie pseudo-unixowego wiersza poleceń Microsoftucommand.com
i pozostaje w jego następcycmd.exe
, podobnie jak praktyka nadużywania::
komentarza do linii.Są identyczne w Bash. Spójrz na
builtins/colon.def
kod źródłowy Bash-4.2.W twoim poleceniu
strace true
faktycznie uruchamiasz plik binarny/bin/true
zamiast wbudowanego bash true.źródło