Quando instruídos a ecoar os comandos à medida que são executados ("trace de execução"), bash
e ksh
adicionam aspas simples em torno de qualquer palavra com meta-caracteres ( *
, ?
, ;
, etc.) nele.
Os metacaracteres poderiam ter entrado na palavra de várias formas. A palavra (ou parte dela) poderia ter sido citada com aspas simples ou duplas, os caracteres poderiam ter escapado com um \
ou permaneceram como resultado de uma tentativa de correspondência de nome de arquivo com falha. Em todos os casos, o rastreio de execução conterá palavras com aspas simples, por exemplo:
$ set -x
$ echo foo\;bar
+ echo 'foo;bar'
Este é apenas um artefato do modo como os shells implementam o rastreio de execução; isso não altera a maneira como os argumentos são finalmente passados para o comando. As aspas são adicionadas, impressas e descartadas. Aqui está a parte relevante do código-fonte bash
, print_cmd.c
:
/* A function to print the words of a simple command when set -x is on. */
void
xtrace_print_word_list (list, xtflags)
...
{
...
for (w = list; w; w = w->next)
{
t = w->word->word;
...
else if (sh_contains_shell_metas (t))
{
x = sh_single_quote (t);
fprintf (xtrace_fp, "%s%s", x, w->next ? " " : "");
free (x);
}
Por que os autores escolheram fazer isso, o código não diz. Mas aqui está um código semelhante em variables.c
, e vem com um comentário:
/* Print the value cell of VAR, a shell variable. Do not print
the name, nor leading/trailing newline. If QUOTE is non-zero,
and the value contains shell metacharacters, quote the value
in such a way that it can be read back in. */
void
print_var_value (var, quote)
...
{
...
else if (quote && sh_contains_shell_metas (value_cell (var)))
{
t = sh_single_quote (value_cell (var));
printf ("%s", t);
free (t);
}
Assim, é possível que seja mais fácil copiar as linhas de comando da saída do rastreio de execução e executá-las novamente.