2009-12-01 17 views
16

Pour la commande:/usr/bin/sh -c "ls 1`" (une citation arrière après 1).Citation de retour d'échappement dans une chaîne entre guillemets dans le shell

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

L'erreur sont toujours:

% /usr/bin/sh -c "ls 1\`" 
Unmatched ` 
+0

Avez-vous un seul backtick? Est-ce que '1 \' 'est un nom de fichier? –

+0

Oui, en fait, je peux créer un fichier nommé "1'" en émettant la commande "touch 1'", mais shell ne peut tout simplement pas l'analyser à l'intérieur de guillemets doubles –

Répondre

1

Utilisez des guillemets simples au lieu:

/usr/bin/sh -c 'ls 1\`' 
33

Vous devez échapper à la backtick, mais aussi échapper la barre oblique inverse:

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

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

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

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

Une autre façon est de stocker le nom du fichier dans une variable, et utiliser cette valeur:

 
$ export F='1`' 
$ printenv F 
1` 
$ /bin/sh -c 'ls $F' # note that /bin/sh interprets $F, not my current shell 
1` 

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

 
$ /bin/sh -c "ls 1'\`'" 
1` 
$ csh # enter csh, the next line is executed in that environment 
% /bin/sh -c "ls 1'\`'" 
Unmatched `. 

Je vous suggère fortement d'éviter de tels noms de fichiers dans le first place.