Diferença entre echo $(cal) e echo "$(cal)"

Diferença entre echo $(cal) e echo "$(cal)"

Estou usando echo $(cal)e echo "$(cal)"no Linux e me dá resultados diferentes como na foto. As aspas duplas não devem interferir $neste caso, então o que dá echo "$(cal)"aquele estilo horizontal comparando com echo $(cal).

Este é o resultado:

Captura de tela da saída

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

Responder1

Existem duas diferenças principais:

  1. O shell executadivisão de palavrasno não citado $(cal). Isso significa, assumindo um valor padrão para IFS, que todas as sequências de espaços em branco (incluindo novas linhas) serão substituídas por um único espaço em branco. Esta é a saída do comando sem aspas em uma única linha.

    Aqui está um exemplo mais simples:

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

    Como você pode ver, no segundo echo, aquele sem aspas duplas, todas as sequências de espaços em branco foram substituídas por espaços em branco simples. Isso é exatamente o que você viu ao usar echosem aspas duplas com echo $(cal).

  2. O shell executaexpansão do nome do caminhono resultado da palavra divisão. Isso não faz nenhuma diferença no seu exemplo, mas, se sua saída incluísse ?ou *outros caracteres glob-ativos, poderia levar a algumas surpresas.

    Aqui está um exemplo simples deexpansão do nome do caminho. Vamos começar com um diretório com três arquivos:

    $ ls
    file1  file2  file3
    

    Agora, vamos definir uma string: $ s='file?'

    Agora, veja que echocom aspas duplas retorna nossa string, mas, sem aspas duplas, a string é expandida em nomes de arquivos:

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

informação relacionada