Um equívoco comum é que o sinal $ significa variável. Na verdade, sinaliza bash para executar uma expansão (há casos em que as variáveis podem ser referenciadas sem o sinal $, mas eu não vou sair do assunto).
Quando o bash vê o sinal $ na frente de uma variável, ele substituirá o $ VAR pelo valor (da variável) e depois executará a linha inteira.
No seu exemplo, o bash fará uma substituição / expansão de comando. Entre os parênteses é um comando, bash executará esse comando primeiro, pegue a saída e substitua o $ (comando) por ele, então execute o comando cd
.
Você pode observar esse comportamento observando um traço. Execute seu script usando bash -x
ou coloque set -o xtrace
abaixo do cabeçalho do seu script.
Exemplo:
#!/bin/bash
set -o xtrace
Isto mostrará os comandos exatos que o bash está executando durante os scripts, o que significa que ocorreram substituições / expansões.
Quanto às aspas, elas não são 100% necessárias, mas pode haver situações em que o comando no seu exemplo não funcione corretamente. E isto é, se houver algum espaço no caminho retornado por cygpath -u 'c:\Program Files\'
. Os argumentos do comando Bash geralmente são delimitados por espaços, e sem as aspas, o bash interpretará esses espaços como um delimitador e não como um espaço literal (também a razão pela qual existem aspas simples ao redor do caminho especificado para o comando cygpath).
Por exemplo, se o caminho retornado for c:\user\Documents and Settings
, sem citações, o bash lerá o comando como cd c:\user\Documents and Settings
, no qual ele considerará que c:\user\Documents
, and
e Settings
são todos argumentos para ser passado para o comando cd
. Isso é um problema porque o comando cd
deve ter apenas um argumento.
As aspas duplas em torno da substituição $ impedem a interpretação do espaço.