2009-12-01 5 views
16

Per il comando:/usr/bin/sh -c "ls 1`" (un backquote dopo 1).Esegui il backquote in una stringa con doppia virgoletta nella shell

Come eseguirlo correttamente? L'aggiunta di una barra rovesciata prima di "" non funziona. `è un carattere speciale come sappiamo, e ho provato a circondarlo anche con una virgoletta singola (/ usr/bin/sh -c" ls 1'` '"), ma non funziona neanche.

L'errore sempre sono:

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

Hai un unico apice? '' \ \ '' Un nome file? –

+0

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 –

risposta

1

Usa virgolette singole invece:

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

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.