O repo
comando não pode se importar com o tipo de cotação que recebe. Se você precisar de expansão de parâmetro, use aspas duplas. Se isso significa que você acaba tendo que inverter uma série de coisas, use aspas simples para a maioria delas e, em seguida, separe-as e entre em duplas na parte em que você precisa que a expansão ocorra.
repo forall -c 'literal stuff goes here; '"stuff with $parameters here"' more literal stuff'
A explicação segue, se você estiver interessado.
Quando você executa um comando a partir do shell, o que esse comando recebe como argumentos é uma matriz de cadeias terminadas em nulo. Essas cadeias podem conter absolutamente qualquer caractere não nulo.
Mas quando o shell está construindo esse conjunto de strings a partir de uma linha de comando, ele interpreta alguns caracteres especialmente; isso foi projetado para facilitar a digitação de comandos (na verdade, possível). Por exemplo, os espaços normalmente indicam o limite entre as strings na matriz; por esse motivo, os argumentos individuais às vezes são chamados de "palavras". Mas um argumento pode, no entanto, ter espaços; você só precisa de uma maneira de dizer ao shell que é isso que você deseja.
Você pode usar uma barra invertida na frente de qualquer caractere (incluindo espaço ou outra barra invertida) para dizer ao shell para tratar esse caractere literalmente. Mas enquanto você pode fazer algo assim:
echo \"Thank\ you.\ \ That\'ll\ be\ \$4.96,\ please,\"\ said\ the\ cashier
... pode ficar cansativo. Portanto, o shell oferece uma alternativa: aspas. Estes vêm em duas variedades principais.
Aspas duplas são chamadas de "aspas de agrupamento". Eles impedem que caracteres curinga e aliases sejam expandidos, mas principalmente são para incluir espaços em uma palavra. Outras coisas como expansão de parâmetro e comando (o tipo de coisa sinalizada por a $
) ainda acontecem. E, claro, se você deseja uma aspas duplas literal dentro de aspas duplas, é necessário fazer uma barra invertida:
echo "\"Thank you. That'll be \$4.96, please,\" said the cashier"
Aspas simples são mais draconianas. Tudo entre eles é tomado completamente literalmente, incluindo barras invertidas. Não há absolutamente nenhuma maneira de obter uma citação única literal dentro de aspas simples.
Felizmente, as aspas no shell não são delimitadores de palavras ; sozinhos, eles não terminam uma palavra. Você pode entrar e sair de aspas, inclusive entre diferentes tipos de aspas, dentro da mesma palavra para obter o resultado desejado:
echo '"Thank you. That'\''ll be $4.96, please," said the cashier'
Portanto, isso é mais fácil - muito menos barras invertidas, embora a seqüência de aspas simples, de barra invertida e de aspas simples literal e de aspas simples demore um tempo para se acostumar.
Os shells modernos adicionaram outro estilo de citação não especificado pelo padrão POSIX, no qual as aspas simples à esquerda são prefixadas com um cifrão. As strings assim citadas seguem convenções semelhantes às literais de strings na linguagem de programação ANSI C e, portanto, às vezes são chamadas de "strings ANSI" e o par $'
... '
"aspas ANSI". Dentro de tais cadeias, o conselho acima sobre barras invertidas sendo literalmente não se aplica mais. Em vez disso, eles se tornam especiais novamente - não apenas você pode incluir aspas ou barra invertida literal colocando uma barra invertida antes, mas o shell também expande as fugas de caracteres ANSI C (como \n
para uma nova linha, \t
para tab e \xHH
para o caractere com código hexadecimalHH
) Caso contrário, no entanto, eles se comportam como cadeias de caracteres simples: nenhuma substituição de parâmetro ou comando ocorre:
echo $'"Thank you. That\'ll be $4.96, please," said the cashier'
O importante a ser observado é que a única sequência recebida como argumento para o echo
comando é exatamente a mesma em todos esses exemplos. Após o shell concluir a análise de uma linha de comando, não há como executar o comando para saber como foi citado. Mesmo que quisesse.
repo forall -c ' ...before... '"$variable"' ...after...'