Ansible 2.9.21: シェルコマンドに不要なエスケープ文字「\」が追加されました

Ansible 2.9.21: シェルコマンドに不要なエスケープ文字「\」が追加されました

私のプレイブックでは、次の行は を返す必要があり1、 を返す場合は>1プレイが停止します。

shell: ls -l /opt/tomcat/|grep "[ ]\+{{ newTomcatVer }}$"; echo $?

私のプレイは確かにこのエラーで失敗しました:

"msg": "There is more than one /opt/tomcat/apache-tomcat-8.x.xx instance on server01, ending play"

デバッグ モードで再度実行すると、このシェル コマンドがデバッグ出力で次のように表されていることがわかります。

"cmd": "ls -l /opt/tomcat/|grep \"[ ]\\+apache-tomcat-8.5.69$\"; echo $?",

上記では、二重引用符は\文字でエスケープされています。問題は、実際に使用されているコマンドはプレイブックにあるコマンドか、デバッグ出力に表示されるコマンドのどちらなのかということです。

ノートブックにあるコマンド、つまりエスケープ文字なしでコマンドを実行すると、出力は1期待どおりになります。

[tomcat@server01 ~]$ ls -l /opt/tomcat/|grep "[ ]\\+apache-tomcat-8.5.69$"; echo $?
1

しかし、デバッグ出力にあるコマンドを発行すると、次のようになります。

[tomcat@server01 ~]$ ls -l /opt/tomcat/|grep \"[ ]\\+apache-tomcat-8.5.69$\"; echo $?
grep: Invalid regular expression
2

これを解決する方法はありますか?

答え1

使用シングルコマンド内の引用符grep

grep "[ ]\+{{ newTomcatVer }}$"

二重引用符を使用すると、シェルは変数の展開を試み、つまり の意味を理解しようとします。これは、シェルが展開できるパラメータとして認識しないために、何を望んでいるかを推測し、引用符をエスケープしようとするため、$"として表示されます。$\"$"

ここでシェル パラメータ拡張を行う理由は特にありません。そのため、正規表現を一重引用符で囲むことでこの問題を解決できます。シェルはパラメータ拡張を行おうとせず、文字どおりに扱います$

grep '[ ]\+{{ newTomcatVer }}$'

関連情報