Seu quebra-cabeça não está certo sobre como bash
(e o shell em geral) analisou a entrada. Em:
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
Primeiro, bash
analisa o lado direito da atribuição para uma longa string $( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
, porque as aspas duplas podem aparecer dentro de aspas duplas .
Depois, bash
começa a analisar a substituição do comando. Como todos os caracteres após o parêntese de abertura até parênteses envolventes são usados para construir o comando dentro da substituição de comando, você obterá:
cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd
O shell continua analisando esse comando composto, divide-o em duas partes:
-
cd "$( dirname "${BASH_SOURCE[0]}" )"
- pwd
Em seguida, aplique a mesma regra de análise para cd "$( dirname "${BASH_SOURCE[0]}" )"
, mas, desta vez, as aspas duplas não são redundantes, mas fazem sentido. Eles impedem a divisão de campos no resultado de $( dirname "${BASH_SOURCE[0]}" )
e também a expansão de ${BASH_SOURCE[0]}
(em contraste com as duplas mais duplas externas, será não são necessários no RHS da atribuição de variáveis para evitar split+glob
).
Esta regra se aplica a substituição de comandos em todos os shell POSIX . Um quebra-cabeça com mais detalhes que você pode ler na seção Reconhecimento de Token da especificação POSIX .