Se requieren comillas dobles en bash para la sustitución de comandos:
$ echo "$(date)"
Fri Oct 28 19:16:40 EDT 2016
Mientras que las comillas simples no realizan sustitución de comandos:
$ echo '$(date)'
$(date)
… ¿Por qué entonces veo el siguiente comportamiento alias
que parece sugerir que la sustitución de comandos ocurrió entre comillas simples?
alias d='$(date)'
$ d
No command 'Fri' found, did you mean:
....
Respuesta1
Versiones entre comillas simples y comillas dobles
Definamos el alias usando comillas simples:
$ alias d='$(date)'
Ahora, recuperemos la definición del alias:
$ alias d
alias d='$(date)'
Observe que aún no se ha realizado ninguna sustitución de comando.
Hagamos lo mismo, pero esta vez entre comillas dobles:
$ alias d="$(date)"
$ alias d
alias d='Fri Oct 28 17:01:12 PDT 2016'
Debido a que se utilizan comillas dobles, la sustitución de comandos se realizó antes de definir el alias.
Versión de comillas simples
Intentemos ejecutar la versión de comillas simples:
$ alias d='$(date)'
$ d
bash: Fri: command not found
La versión de comillas simples equivale a ejecutar:
$ $(date)
bash: Fri: command not found
En ambos casos, la sustitución del comando se realiza cuando se ejecuta el comando.
Una variacion
Consideremos este alias que usa sustitución de comandos y se define usando comillas simples:
$ alias e='echo $(date)'
$ e
Fri Oct 28 17:05:29 PDT 2016
$ e
Fri Oct 28 17:05:35 PDT 2016
Cada vez que ejecutamos este comando, date
se evalúa nuevamente. Con comillas simples, la sustitución del comando se realiza cuando se ejecuta el alias, no cuando se define.
Respuesta2
Si utiliza comillas dobles al definir un alias, la expansión del parámetro se produce en eldefinición de aliastiempo.
Por ejemplo:
$ pwd
/tmp
$ echo $PWD
/tmp
$ alias p="echo $PWD"
$ p
/tmp
$ cd /
$ pwd
/
$ p
/tmp
$ alias p
alias p='echo /tmp'
$
Si desea que la expansión de parámetros ocurra en el momento en quellamarel alias, utilice comillas simples al definir el alias:
$ alias p='echo $PWD'
$ p
/tmp
$ cd /
$ p
/
$
Por supuesto que nunca haycualquiermotivo para ejecutar el comando . Sé que usaste esto solo como ejemplo, pero como lo he visto tantas veces "en la naturaleza", lo aclararé de todos modos: lo que esto significa es ejecutar el echo "$(date)"
date
comando y capturar la salida (eliminando cualquier nueva línea final). Luego, pase esa salida capturada como argumento al echo
comando, que la imprimirá, junto con una nueva línea final. No hay ninguna ventaja sobre simplemente ejecutar date
directamente.
Sin embargo, aquí también tienes un problema diferente:
Cuando configura el alias d='$(date)'
, cuando escribe d
obtendrá el resultado literal de escribir $(date)
en la línea de comando: el date
comando se ejecutará, se capturará la salida, se eliminará la nueva línea final y luego la salida se analizará como un comando por el shell (incluida la división de palabras y la expansión global de archivos).
Como es viernes, la primera palabra que sale date
es "Fri", por lo que el shell intenta ejecutar esto como un comando.
Si lo que quieres esverla fecha en la que escribes d
, solo usa:
alias d=date
o
alias d='date'
o
alias d="date"
No importa qué formato utilice, ya que no hay caracteres especiales que requieran ningún tipo de cita.
Respuesta3
¿Está pasando ~/.bashrc
? Hay una parte comentada en el~/.bashrc
95 # Alias definitions.
96 # You may want to put all your additions into a separate file like
97 # ~/.bash_aliases, instead of adding them here directly.
98 # See /usr/share/doc/bash-doc/examples in the bash-doc package.
y es por eso que uso otro archivo sugerido para mis atajos:
el~/.bash_aliases
La clave es escapar de la comilla simple:
# I use vim but nano or gedit is also fine
vim ~/.bashrc # or vim ~/.bash_aliases
# create your alias:
alias d=''\'date''\'
# or
alias dd="'date'"
# or
alias ddd='"date"'
Luego abra una nueva sesión de terminal y d
ejecutará lo que desee.