substitution de command entre apostrophes pour alias

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: .... 

Versions à guillemets simples ou à guillemets doubles

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.

Version à devis unique

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.

Une variation

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 echo "$(date)" . 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 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.