La soluzione semplice è inserire una virgoletta singola ( ') all'inizio e un'altra virgoletta alla fine e sostituire ogni 'carattere all'interno del nome del file con la sequenza di 4 caratteri '\''. Tutti i caratteri perdono il loro significato speciale all'interno di una stringa a virgoletta singola, tranne se 'stesso che segna la fine della stringa. La sequenza '\''termina il letterale a virgoletta singola, segue immediatamente una virgoletta singola quotata e apre un nuovo letterale a virgoletta singola. Da qui il nome del file
This file's name has some weird characters!
Will you manage to escape them?
può essere citato come segue:
somecommand 'This file'\''s name has some weird characters!
Will you manage to escape them?'
Le virgolette doppie hanno regole di escape più complesse e non ti consentono di includere un punto esclamativo !se la sostituzione della cronologia è attivata, quindi non le prenderò in considerazione ulteriormente.
Un approccio alternativo è quello di proteggere i personaggi con barre rovesciate. Funziona con tutti i personaggi tranne i newline; per una nuova riga, inserirla tra virgolette singole (o doppie virgolette) è l'unica soluzione. Se si desidera ridurre al minimo il numero di barre rovesciate per presentare all'utente il nome tra virgolette, è possibile limitarlo ai luoghi in cui è necessaria la barra rovesciata; tuttavia, più barre retroverse si omettono, più si rischia di dimenticare quella necessaria. Lettere, cifre e caratteri non ASCII sono sempre ok¹. Cita spazi bianchi e punteggiatura ogni volta che non sei sicuro.
Con una shell tipica (ksh, bash o zsh), è necessario citare i seguenti caratteri in almeno alcune circostanze.
- Spazio bianco (spazio, tabulazione, nuova riga - ricordando che le nuove righe non possono essere quotate con una barra rovesciata).
! - espansione della storia.
" - sintassi della shell.
#- commento inizia quando preceduto da spazi bianchi; caratteri jolly zsh.
$ - sintassi della shell.
& - sintassi della shell.
' - sintassi della shell.
(- anche nel mezzo di una parola: globi estesi ksh (disponibile anche in bash e zsh); caratteri jolly zsh.
)(vedi ()
* - sh carattere jolly.
, - solo all'interno dell'espansione del tutore.
; - sintassi della shell.
< - sintassi della shell.
= - in zsh, quando si trova all'inizio del nome di un file (espansione del nome file con ricerca PATH).
> - sintassi della shell.
? - sh carattere jolly.
[ - sh carattere jolly.
\ - sintassi della shell.
] - potresti cavartela lasciandola non quotata.
^- espansione della storia; jolly zsh.
` - sintassi della shell.
{ - espansione parentesi graffa.
| - sintassi della shell.
} - deve essere evaso in zsh, altre shell sono più indulgenti quando non c'è parentesi graffa di apertura corrispondente.
~- espansione della home directory quando è all'inizio del nome di un file; carattere jolly zsh; sempre al sicuro quando è l'ultimo personaggio.
Qualche altro personaggio può richiedere una gestione speciale a volte:
-non è speciale per la shell, ma quando è all'inizio di un argomento di comando, indica un'opzione. Non può essere protetto con virgolette poiché la gestione speciale è nel comando, non nella shell. Per proteggere un nome di file che inizia con -, puoi metterlo ./prima - in questo modo è ancora lo stesso file, ma l'argomento non inizia -più.
.non è speciale in sé, ma i file dot sono esclusi dai *globs per impostazione predefinita.
:non è speciale per la shell, ma alcuni comandi lo analizzano in modo particolare, ad esempio per indicare un file remoto ( hostname:filename). Consultare la documentazione del comando per vedere come far fronte a file infetti contenenti due punti.
¹ A meno che l'utente non abbia configurato caratteri di espansione della cronologia alternativi. Alcune shell lo consentono. Questo è un altro motivo per usare le virgolette singole anziché le barre rovesciate.