`date` s'étendra simplement à la sortie de la date
commande. Cependant, il supprime les caractères d'espace supplémentaires aux endroits où il y a plus d'un caractère d'espace consécutif dans la sortie. (Cela est dû au fait que la substitution de commande est sujette au fractionnement de mots et à la façon dont la echo
commande gère plusieurs arguments.)
Dans "` date` " , les guillemets doubles sont des guillemets faibles, ils étendent donc les variables (essayez" $ PWD ") et effectuent la substitution de commande. Le résultat de l'expansion est transmis en tant qu'argument unique à la echo
commande, avec tous les espaces consécutifs inclus: autrement dit, le fractionnement de mot n'est pas effectué.
Dans 'date' , les guillemets simples sont des guillemets plus forts, donc ils ne permettront pas l'expansion des variables ou la substitution de commandes en leur sein.
Reportez - vous à ce lien pour plus d'explications.
Modifié le premier point comme l'a correctement souligné Michael Suelmann dans le commentaire ci-dessous .
Chirag Bhatia - chirag64
la source
date
commande nue .Tous les deux
et
affichera la date. La sortie de ce dernier ressemble à la sortie de l'exécution
date
par elle-même.Il y a cependant une différence: celui entouré de
"
guillemets"
sera envoyé à enecho
tant qu'argument unique. Les guillemets encapsulent la sortie de la commande entière en un seul argument. Commeecho
il affiche simplement ses arguments dans l'ordre, avec des espaces entre les deux, il sera fondamentalement le même.Voici un exemple de la subtile différence:
produit:
mais:
produit:
Notez que les deux espaces après
Nov
ont été réduits à un sans les guillemets. En effet, le shell analyse chaque élément séparé par des espaces et envoie le résultat à l'écho sous forme de 6 arguments. Lorsque vous le citez, echo reçoit un seul argument et les guillemets conservent l'espace.Cela devient beaucoup plus important dans les commandes autres que l'écho. Par exemple, imaginez une commande
foo
qui souhaite deux arguments: une date et une adresse e-mail.Cela fonctionnera dans ce scénario:
Mais cela confondra le script en lui envoyant 7 arguments:
la source
Dans les shells POSIX,
`date`
c'est l'ancienne forme de substitution de commande. La syntaxe moderne est$(date)
.Dans les deux cas, ils se développent jusqu'à la sortie de
date
avec les caractères de fin de ligne supprimés (à condition que la sortie ne contienne pas de caractères NUL).Cependant, lorsqu'il n'est pas entre guillemets doubles et dans des contextes de liste (par exemple dans les arguments de commandes simples comme
echo
dans votre cas), cette expansion est en outre soumise à:Fractionnement de mots : c'est-à-dire que la "sortie de
date
avec les caractères de nouvelle ligne de fin supprimés" est divisée en fonction de la valeur actuelle de la$IFS
variable (contenant par défaut espace, tabulation et nouvelle ligne (et NUL aveczsh
)) en plusieurs mots .Par exemple, si les
date
sortiesFri 1 Nov 14:11:15 GMT 2013\n
(comme il le fait souvent dans un environnement linguistique anglais et dans un fuseau horaire continent britannique), et$IFS
contient actuellement:
, qui sera divisé en 3 mots :Fri 1 Nov 14
,11
et15 GMT 2013
.zsh
): qui est, chaque mot résultant de la division ci - dessus est recherché des caractères génériques (*
,?
,[...]
bien que certains obus ont plus), et étendu à la liste des noms de fichiers qui correspondent à ces modèles. Par exemple, si la sortiedate
est?%? 33 */*/* UVC 3432
(comme il est souvent dans des endroits vénusienne et fuseau horaire UVC), et$IFS
est la valeur par défaut), puis qui se développe à tous les noms de fichiers de caractères non-cachés 3 dans le répertoire courant dont le caractère milieu est%
,33
, tous les fichiers non masqués dans tous les sous-répertoires non masqués de tous les sous-répertoires non masqués du répertoire en cours,UVC
et3432
.C'est pourquoi:
$IFS
les caractères sur lesquels vous souhaitez fractionner.set +f
pour le désactiver.Les guillemets simples citent tout, donc les caractères de backtick doivent être pris littéralement.
Exemple (l'utilisation
-x
permet de voir plus facilement ce qui se passe):Si la sortie contient des caractères NUL, le comportement varie d'un shell à l'autre: certains les suppriment, certains tronquent la sortie au premier caractère NUL, les
zsh
conservent mais notez que de toute façon les commandes externes ne peuvent pas prendre d'arguments contenant des NULla source
Avec `date`, vous obtenez la sortie de la date divisée en plusieurs mots, car la division des mots est effectuée après la substitution de commande.
Avec "` date` ", vous obtenez la sortie de la date sous la forme d'un mot / paramètre car il existe une substitution de commande entre guillemets doubles, mais la sortie n'est pas analysée davantage. La même chose est valable avec une expansion variable comme "$ i" dans mon exemple ci-dessous.
Avec «date», vous obtenez une «date» littérale car il n'y a pas de substitution de commande entre guillemets simples.
Peut-être que les différences des 3 formes seront plus visibles de cette façon:
la source