A provável diferença mais importante seria se o diretório em que o script está continha um espaço. Nesse caso, a primeira linha, a que não continha aspas duplas, falharia. Isso seria o resultado da "divisão de palavras" que o bash faz em strings não citadas.
Suponha que o resultado de dirname ${BASH_SOURCE[0]}
seja /home/j r/bin
. Considere a linha sem aspas:
source $(dirname ${BASH_SOURCE[0]})/script.sh
Neste caso, o bash verá o comando:
source /home/j r/bin/script.sh
Após a divisão de palavras, o comando source
vê um nome de script, /home/j
e um argumento para o script, r/bin/script.sh
. Muito provavelmente, não há script com esse nome e o bash retornará a mensagem de erro:
bash: /bin/j: No such file or directory
Agora, considere o que acontece com aspas duplas:
source "$(dirname ${BASH_SOURCE[0]})/script.sh"
Nesse caso, o comando source procurará um script chamado /home/j r/bin/script.sh
e tentará originá-lo.
Para completar, vamos considerar aspas simples:
source '$(dirname ${BASH_SOURCE[0]})/script.sh'
Neste caso, ao contrário dos dois anteriores, dirname
nunca é executado. O comando source tentará originar um comando com o nome literal $(dirname ${BASH_SOURCE[0]})/script.sh
. Provavelmente não existe tal arquivo e o bash emitirá uma mensagem de erro.
Como o bash trata strings entre aspas duplas é descrito detalhadamente em man bash
:
Enclosing characters in double quotes preserves the literal value of
all characters within the quotes, with the exception of $, ', \, and,
when history expansion is enabled, !. The characters $ and ' retain
their special meaning within double quotes. The backslash retains its
special meaning only when followed by one of the following characters:
$, ', ", \, or <newline>. A double quote may be quoted within double
quotes by preceding it with a backslash. If enabled, history expansion
will be performed unless an ! appearing in double quotes is escaped
using a backslash. The backslash preceding the ! is not removed.