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.
Avez-vous un seul backtick? Est-ce que '1 \' 'est un nom de fichier? –
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 –