Qual é a diferença entre echo $ (pwd) e echo “$ (pwd)”?

1

Qual é a diferença entre echo $(pwd) e echo "$(pwd)" ?

Eu lembro que eles são a mesma coisa, mas os dois comandos me dão resultados diferentes.

Aqui está minha saída:

/usr/share/locale ⌚ 21:19:24
$ echo $(pwd)
 usr shar  l cal 

/usr/share/locale ⌚ 21:19:32
$ echo "$(pwd)"
/usr/share/locale

Parece que muitos caracteres são descartados por echo $(pwd) , portanto, muitos scripts não podem ser executados corretamente. Por exemplo, devo usar eval "$(something --alias)" em vez de eval $(something --alias) .

Eu tentei echo $(pwd) e echo "$(pwd)" em um contêiner docker, as saídas são as mesmas.

Há algo errado no meu sistema?

    
por Qianba 08.08.2017 / 15:38

1 resposta

3

É tudo sobre a divisão de palavras, há uma variável chamada IFS : separador de campo interno, após uma expansão ou substituição, o bash dividirá os resultados desse processo em palavras diferentes com base no valor do IFS.

O valor padrão desta variável é: "<space><tab><newline>" , significa palavras separadas por espaço ou tabulação ou uma nova linha será considerada e passada como palavras separadas para o seu comando.

Portanto, uma variável com o valor "olá nome é foo", após a expansão será considerada como 4 palavras diferentes:

$ printf "%s\n" hello name is foo
hello
name
is
foo

Se eu quiser considerá-lo como uma única palavra, devo citá-lo:

$ printf "%s\n" "hello name is foo"
hello name is foo

Se eu definir o IFS como / , ele usará / como separador de campo, portanto:

$ export IFS='/'
$ var=/some/thing/here
$ echo $var
 some thing here

Esse pode ser o seu caso (ter um / no IFS), no entanto, se você citar a subsituição como: "$( ... )" , então o bash ignorará a divisão de palavras.

tente executar seus comandos novamente, agora ele não deve usar / para separar palavras, incluindo o caminho (pwd).

    
por 08.08.2017 / 16:03