Les guillemets doubles sont requirejs dans bash pour la substitution de command:
$ echo "$(date)" Fri Oct 28 19:16:40 EDT 2016
Alors que les guillemets simples ne font pas de substitution de command:
$ echo '$(date)' $(date)
… pourquoi puis-je voir le comportement suivant avec alias
qui semble suggérer que la substitution de command est arrivé avec des guillemets simples?
alias d='$(date)' $ d No command 'Fri' found, did you mean: ....
Définissons l'alias en utilisant des guillemets simples:
$ alias d='$(date)'
Maintenant, récupérons la définition de l'alias:
$ alias d alias d='$(date)'
Observez qu'aucune substitution de command n'a encore été effectuée.
Faisons la même chose, mais cette fois avec des guillemets doubles:
$ alias d="$(date)" $ alias d alias d='Fri Oct 28 17:01:12 PDT 2016'
Comme les guillemets doubles sont utilisés, la substitution de command a été effectuée avant la définition de l'alias.
Essayons d'exécuter la version à guillemet simple:
$ alias d='$(date)' $ d bash: Fri: command not found
La version du guillemet simple est équivalente à l'exécution:
$ $(date) bash: Fri: command not found
Dans les deux cas, la substitution de command est effectuée lorsque la command est exécutée.
Considérons cet alias qui utilise la substitution de command et est défini en utilisant des guillemets simples:
$ alias e='echo $(date)' $ e Fri Oct 28 17:05:29 PDT 2016 $ e Fri Oct 28 17:05:35 PDT 2016
Chaque fois que nous exécutons cette command, la date
est à nouveau évaluée. Avec des guillemets simples, la substitution de command est effectuée lorsque l'alias est exécuté, pas lorsqu'il est défini.
Si vous utilisez des guillemets doubles lors de la définition d'un alias, l'expansion des parameters se produit à l'heure de définition de l' alias .
Par exemple:
$ pwd /tmp $ echo $PWD /tmp $ alias p="echo $PWD" $ p /tmp $ cd / $ pwd / $ p /tmp $ alias p alias p='echo /tmp' $
Si vous souhaitez que l'expansion des parameters se produise au moment où vous appelez l'alias, utilisez des apostrophes lors de la définition de l'alias:
$ alias p='echo $PWD' $ p /tmp $ cd / $ p / $
Bien sûr, il n'y a jamais de raison d'exécuter la command . Je sais que vous avez utilisé ceci comme un exemple, mais comme je l'ai vu tant de fois "dans la nature", je vais clarifier de toute façon: Ce que cela signifie, c'est exécuter la command echo "$(date)"
date
et capturer la sortie . Puis transmettez cette sortie capturée en tant qu'argument à la command echo
, qui l'imprimera, avec une seule nouvelle ligne de fin. Il n'y a aucun avantage sur la juste date
course directement.
Cependant, vous avez aussi un problème différent:
Lorsque vous définissez l'alias d='$(date)'
, lorsque vous tapez d
vous obtiendrez le résultat littéral de la saisie de $(date)
sur la command line: la command date
sera exécutée, la sortie sera capturée être dépouillée, puis la sortie sera analysée comme une command par le shell (y compris la division des mots et l'expansion du file glob).
Comme c'est vendredi, le premier mot sorti par date
est "Fri", donc le shell essaie de l'exécuter comme une command.
Si ce que vous voulez est de voir la date à laquelle vous tapez d
, utilisez simplement:
alias d=date
ou
alias d='date'
ou
alias d="date"
Peu importe la forme que vous utilisez, car il n'y a pas de caractères spéciaux nécessitant une forme de citation.