Por que o bash expande o histórico / ponto de exclamação quando entre aspas simples?

1

Estou criando um script para configurar um servidor a partir do zero, parte dele é o postgres. Um dos problemas que estou tendo é se uma senha aleatória tiver uma exclamação, parece ser expandida pelo bash:

Eu quero executar o seguinte comando postgres:

alter user root with encrypted password 'D1£example!2eNZY6P$9examplePassword';

Mas a partir do script bash usando:

psql -c "command;"

Usando:

runuser -l postgres -c "above cammand"

Então eu entendo isso:

psqlcmd1="psql -c \"""alter user root with encrypted password 'D1£LF1A\!2eNZY6P$9examplePassword';""\""
runuser -l postgres -c "$psqlcmd1"

Mas o bash expande o! mesmo que entre aspas simples?

Além disso, tentei as seguintes com base nisso para escapar das citações sem sorte:

runuser -l postgres -c "psql -c 'alter user root with encrypted password '"'"'D1£example!2eNZY6P$9examplePassword'"'"';'"
    
por AirCombat 23.09.2015 / 12:01

1 resposta

1
psqlcmd1="psql -c \"""alter user root with encrypted password 'D1£LF1A\!2eNZY6P$9examplePassword';""\""

Com a expansão do histórico desativada, o valor de psqlcmd1 é

psql -c "alter user root with encrypted password 'D1£LF1A\!2eNZY6PexamplePassword;"

Dentro de aspas duplas, os únicos caracteres que não se destacam são \"$' , mais ! se a expansão do histórico estiver ativada. Note em particular que ' dentro de aspas duplas significa: ele não inicia uma string literal, as aspas duplas já iniciaram uma. Observe também que, como $ inicia uma expansão variável, $9 é expandido; seu valor é o 9º parâmetro para o script atual da função, vazio se houver menos de 9 parâmetros.

Observe também que "foo""bar" é a mesma coisa que "foobar" : são dois literais de string unidos, então pode ser escrito como um único literal de string.

Dentro de aspas duplas, você precisa colocar uma barra invertida antes dos caracteres \"$' se quiser que a sequência resultante inclua esse caractere. Isso não funciona para ! : "!" é a string ! em um script, mas invoca a expansão de histórico se isso estiver ativado; "\!" é sempre a string \! . Você precisa usar aspas simples ou sem aspas em torno do ! . O mais simples seria usar um literal com aspas simples: todos os caracteres entre aspas simples representam eles mesmos, exceto as aspas simples. Para incluir uma aspa simples em um literal com aspas simples, termine o literal, use uma folga para citar uma aspa simples e inicie um literal entre aspas simples; ou, em outras palavras, para incluir uma aspa simples em um literal entre aspas simples, escreva '\'' .

psqlcmd1='alter user root with encrypted password '\''D1£example!2eNZY6P$9examplePassword'\'';'
    
por 24.09.2015 / 02:38