Qual'è la differenza tra: e true?


15

In bash:

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

Sembra che siano gli stessi, ma non danno la stessa traccia di sistema:

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

Ho provato a differire strace bash -c : 2>:.txte strace bash -c true 2>true.txt, ma non sono riuscito a trovare alcuna differenza tra loro, tranne per le posizioni di memoria.

In dash:

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

OK, quindi non sono gli stessi. help :e help truenon sono molto utili e restituiscono lo stesso in bashe dash. C'è qualche differenza pratica tra loro, tranne per il fatto che :salva tre byte e rende gli script meno leggibili?


Risposte:


27

Non c'è vera differenza nel comportamento. Entrambi i comandi non eseguono alcuna operazione e terminano con uno stato corretto. :sottolinea di non fare nulla;truesottolinea lo stato di successo.

strace truefunziona perché trueè sia una shell incorporata che un comando esterno ( /bin/true); :è solo una shell incorporata (non c'è /bin/:- anche se potrebbe esserci, e probabilmente era su sistemi Unix molto vecchi). In bash, prova

type -a :
type -a true

Le ragioni che esistono entrambe sono storiche. Se ricordo bene, alcune prime shell non avevano una sintassi di commento, quindi è :stato usato il comando do-nothing .

C'è qualche differenza interna in dash. Guardando la fonte, disponibile su git: //git.kernel.org/pub/scm/utils/dash/dash.git, mostra alcuni percorsi di codice diversi eval.c, ma non sono stato in grado di produrre alcun comportamento visibilmente diverso altro della parola specialnell'output di type :.


8
Inoltre, le prime versioni di UNIX non avevano /bin/trueo /bin/false. Anche il :comando viene talvolta utilizzato per gli effetti collaterali trattamento argomento: : ${num_times:=10}.
Arcege,

5
:era originariamente un indicatore di etichetta , di nuovo in un antenato della shell Bourne che aveva goto. Apparentemente è :stato abusato come indicatore di commento e bloccato.
Gilles 'SO-smetti di essere malvagio' il

1
Il comportamento di :indicatore di etichetta per goto è stato preservato nel clone della riga di comando pseudo-Unix di Microsoft command.com, e rimane nel suo successore cmd.exe, così come la pratica di abusare ::di un commento di riga.
Sorpigal,

8

Sono identici in Bash. Guarda builtins/colon.defnel codice sorgente di Bash-4.2.

Nel tuo comando strace truestai effettivamente eseguendo il binario /bin/trueinvece del vero bash incorporato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.