avete bisogno di sfuggire alla backtick, ma anche sfuggire alla barra rovesciata:
$ touch 1\`
$ /bin/sh -c "ls 1\\\`"
1`
La ragione devi scappare "due volte" perché stai inserendo questo comando in un ambiente (come uno script di shell) tha t interpreta la stringa doppia citazione una volta. Quindi viene interpretato di nuovo dalla subshell.
Si potrebbe anche evitare i doppi apici, e quindi evitare la prima interpretazione:
$ /bin/sh -c 'ls 1\`'
1`
Un altro modo è quello di memorizzare il nome del file in una variabile, e utilizzare tale valore:
$ export F='1`'
$ printenv F
1`
$ /bin/sh -c 'ls $F' # note that /bin/sh interprets $F, not my current shell
1`
E infine, quello che hai provato funzionerà su alcune shell (sto usando bash, come per gli esempi precedenti), solo apparentemente non con la tua shell:
$ /bin/sh -c "ls 1'\`'"
1`
$ csh # enter csh, the next line is executed in that environment
% /bin/sh -c "ls 1'\`'"
Unmatched `.
Consiglio vivamente di evitare nomi di file di questo tipo nel first place.
fonte
2010-02-22 10:37:55
Hai un unico apice? '' \ \ '' Un nome file? –
Sì, in realtà posso creare un file denominato "1" "emettendo il comando" touch 1' ", ma la shell non è in grado di analizzarla tra virgolette doppie –