sustitución de comandos entre comillas simples para alias

sustitución de comandos entre comillas simples para alias

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 aliasque 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, datese 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 echo "$(date)". 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 datecomando y capturar la salida (eliminando cualquier nueva línea final). Luego, pase esa salida capturada como argumento al echocomando, que la imprimirá, junto con una nueva línea final. No hay ninguna ventaja sobre simplemente ejecutar datedirectamente.

Sin embargo, aquí también tienes un problema diferente:

Cuando configura el alias d='$(date)', cuando escribe dobtendrá el resultado literal de escribir $(date)en la línea de comando: el datecomando 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 datees "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 dejecutará lo que desee.

información relacionada