A string `! 23` é substituída por` docker` na linha de comando

17

Eu tenho um comando Maven com o parâmetro:

mvn test -Dcommon_password=!23foo

Este comando está sendo executado como

mvn test -Dcommon_password=dockerfoo

Ou seja, !23está sendo substituído por docker. Por que isso acontece e como posso evitá-lo?

Vitalii Plagov
fonte

Respostas:

43

Isso é expansão do histórico : !23é substituído pelo 23º comando do seu histórico.

Para evitar isso, use aspas simples:

mvn test '-Dcommon_password=!23foo'
Stephen Kitt
fonte
5
ou desative-o completamente com set +H/set +o histexpand
ilkkachu 16/04
12
Essa é uma senha que pode potencialmente conter todos os tipos de metacaracteres do shell. Citar e escapar adequadamente, como na resposta de M. Kitt, é melhor do que desativar apenas uma das possibilidades que podem ocorrer. Obviamente, não ter uma senha nos argumentos do processo seria melhor ainda . (-:
JdeBP 17/04
@JdeBP na minha pergunta, mostrei uma senha em texto sem formatação apenas por uma questão de simplicidade. Em um projeto real, esse argumento assume o valor de uma credencial secreta de Jenkins. Então, é mascarado e seguro.
Vitalii Plagov 17/04