Diferencia entre echo $(cal) y echo "$(cal)"

Diferencia entre echo $(cal) y echo "$(cal)"

Estoy usando echo $(cal)y echo "$(cal)"en Linux y me da resultados diferentes a los de la imagen. Las comillas dobles no deberían interferir $en este caso, entonces, ¿qué le da echo "$(cal)"ese estilo horizontal en comparación con echo $(cal)?

Este es el resultado:

Captura de pantalla de salida

echo "$(cal)"

Su Mo Tu We Th Fr Sa  
                   1  
 2  3  4  5  6  7  8  
 9 10 11 12 13 14 15  
16 17 18 19 20 21 22  
23 24 25 26 27 28 29  
30

echo $(cal)

June 2019 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

Respuesta1

Hay dos diferencias clave:

  1. El caparazón actúadivisión de palabrassobre lo no cotizado $(cal). Esto significa, suponiendo un valor predeterminado para IFS, que todas las cadenas de espacios en blanco (incluidas las nuevas líneas) se reemplazan por un único espacio en blanco. Este es el resultado del comando sin comillas en una sola línea.

    Aquí hay un ejemplo más simple:

    $ s='line     1
    > line  2'
    $ echo "$s"
    line     1
    line  2
    $ echo $s
    line 1 line 2
    

    Como puede ver, en el segundo echo, el que no tiene comillas dobles, todas las secuencias de espacios en blanco han sido reemplazadas por espacios en blanco simples. Esto es justo lo que viste cuando usaste echosin comillas dobles con echo $(cal).

  2. El caparazón actúaexpansión del nombre de rutasobre el resultado de la división de palabras. Esto no hace ninguna diferencia en su ejemplo pero, si su resultado incluyó ?u *otros personajes activos globalmente, podría generar algunas sorpresas.

    He aquí un ejemplo sencillo deexpansión del nombre de ruta. Comencemos con un directorio con tres archivos:

    $ ls
    file1  file2  file3
    

    Ahora, definamos una cadena: $ s='file?'

    Ahora, veamos que echocon comillas dobles devuelve nuestra cadena pero, sin comillas dobles, la cadena se expande en nombres de archivos:

    $ echo "$s"
    file?
    $ echo $s
    file1 file2 file3
    

información relacionada