web-dev-qa-db-ja.com

シェルで二重引用符で囲まれた文字列でバッククォートをエスケープする

コマンドの場合:/ usr/bin/sh -c "ls 1`"(1の後の逆引用符)。

正常に実行する方法は? 「 `」の前にバックスラッシュを追加しても機能しません。 `は私たちが知っている特殊な文字です。私もそれを一重引用符で囲みました(/ usr/bin/sh -c" ls 1'` '")。しかし、それも機能しません。

エラーは常に次のとおりです。

% /usr/bin/sh -c "ls 1\`"
Unmatched `
29
user221839

バックティックをエスケープする必要がありますが、バックスラッシュもエスケープする必要があります。

 $ touch 1\`
 $/bin/sh -c" ls 1 \\\ `" 
 1` 

「2回」エスケープする必要があるのは、二重引用符で囲まれた文字列を1回解釈する環境(シェルスクリプトなど)でこのコマンドを入力しているためです。その後、サブシェルによって再度解釈されます。

また、二重引用符を避けて、最初の解釈を避けることもできます。

 $/bin/sh -c 'ls 1\`' 
 1` 

別の方法は、ファイル名を変数に格納し、その値を使用することです。

 $ export F = '1`' 
 $ printenv F 
 1` 
 $/bin/sh -c 'ls $ F'#/ bin/shは、現在のシェルではなく$ Fを解釈します
 1` 

そして最後に、あなたが試みたものはいくつかのシェルで動作します(上の例のようにbashを使用しています)。

 $/bin/sh -c "ls 1 '\`' "
 1` 
 $ csh#cshと入力すると、次の行がその環境で実行されます
%/ bin/sh -c "ls 1 '\`' "
一致しない`。

最初の場所 でこのようなファイル名を使用しないことを強くお勧めします。

46
Roger Pate

代わりに単一引用符を使用してください:

/usr/bin/sh -c 'ls 1\`'
 /usr/bin/sh -c "ls '1\`'"
0
ghostdog74