web-dev-qa-db-fra.com

Escape backquote dans une chaîne à double guillemet dans un shell

Pour la commande:/usr/bin/sh -c "ls 1`" (une citation arrière après 1).

Comment le faire fonctionner avec succès? L'ajout d'une barre oblique inverse avant "` "ne fonctionne pas. `est un personnage spécial, comme nous le savons, et j’ai aussi essayé de l’entourer de guillemets simples (/ usr/bin/sh -c" ls 1'` '"), mais cela ne fonctionne pas non plus.

Les erreurs sont toujours:

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

Vous devez éviter le backtick, mais aussi le backslash:

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

Vous devez y échapper "deux fois" parce que vous entrez cette commande dans un environnement (tel qu'un script Shell) qui interprète une fois la chaîne entre guillemets. Il est ensuite interprété à nouveau par le sous-shell.

Vous pouvez également éviter les guillemets et éviter ainsi la première interprétation:

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

Une autre méthode consiste à stocker le nom de fichier dans une variable et à utiliser cette valeur:

 $ export F = '1`' 
 $ printenv F 
 1` 
 $/bin/sh -c 'ls $ F' # notez que/bin/sh interprète $ F, pas mon shell actuel 
 1` 

Et enfin, ce que vous avez essayé fonctionnera sur certains obus (j'utilise bash, comme pour les exemples ci-dessus), mais apparemment pas avec votre shell:

 $/bin/sh -c "ls 1 '\' '" 
 1` 
 $ csh # enter csh, la ligne suivante est exécutée dans cet environnement 
%/bin/sh -c "ls 1 '\' '" 
 Sans correspondance `. 

Je vous suggère fortement d'éviter ces noms de fichiers à la première place .

39
Roger Pate

Utilisez des guillemets simples à la place:

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