Come posso testare la robustezza della gestione dei file del mio script shell?


11

Ho scritto uno script di shell che gestisce alcuni nomi di file "regolari", ma ho letto Perché il mio script di shell soffoca su spazi bianchi o altri caratteri speciali? e perché non dovresti analizzare l'output di ls e mi piacerebbe che fosse più robusto e gestisse tutti i nomi di file validi (e / o nomi di directory). Come posso creare un banco di prova di file e directory per eseguire il mio script?

Risposte:


11

Crea una directory separata in cui giocare (per facilitare la pulizia in seguito, principalmente); questo utilizza il valore di $TMPDIRse è impostato, altrimenti /tmp:

mkdir "${TMPDIR-/tmp}/testing"
cd "${TMPDIR-/tmp}/testing"

Crea file separati, ma che appaiono simili tra loro a causa dello spazio bianco (spazio, tabulazione, nuova riga, ritorno a capo, backspace):

touch -- a b 'a ' 'b ' 'a b' 'a  b' $'a\bb'
touch -- a$'\xe2\x80\x82'b a$'\xe2\x80\x83'b a$'\t'b a$'\n'b a$'\r'b

Ringraziamo quanto sopra per Patrick . I due codici esadecimali sono separatori di spazio UTF-8 noti come dado e montone ; "nel contesto bidirezionale funge da spazio bianco e (non) è speculare. I glifi possono, in determinate circostanze, essere confusi con altri 20 glifi."

Crea un file semplice e uno che si espanderebbe al primo se fosse trattato come un glob:

touch -- x '[x]' 

Ringraziamo quanto sopra a Wumpus Q. Wumbley .

Allo stesso modo:

touch -- 'a?b' 'a*b'

Ringraziamo quanto sopra a dave_thompson_085 nei commenti qui.

touch -- foo\`echo\ malicious\`bar

Ringraziamo quanto sopra per godlygeek .

Un nome file che si espanderà in qualcosa di diverso (ed esecuzione potenzialmente arbitraria!) Se valutato in un contesto shell:

touch '$( echo boom )'

Uso:

touch -- single\'quote double\"quote back\\slash

catturare i tentativi di mettere un nome file tra virgolette senza sfuggire alle virgolette.

touch -- -a -b -c -r -R - a=x

Ringraziamo quanto sopra a Stéphane Chazelas .

Crea una pipe con nome e un link simbolico (per creare file che non sono "normali"):

mkfifo fifo
ln -s a alink

Crea sottodirectory con vari spazi bianchi inclusi nei loro nomi, insieme a file token al loro interno:

mkdir subdir "subdir 1" "subdir 2" "subdir 3 " subdir$'\n'4
touch subdir/file0 "subdir 1"/file1 "subdir 2"/file2 "subdir 3 "/file3 subdir$'\n'4/file4

Crea nomi di file contenenti solo *(possibilmente problematico da rimuovere), un nome di file composto solo da uno spazio (normale!), Un collegamento simbolico morto, un collegamento simbolico che scorre su se stesso e una sottodirectory con un collegamento alla directory principale:

touch -- '*' '**' '***' ' '

ln -s /does/not/exist dead

ln -s loop loop

mkdir subdir_with_link
(cd subdir_with_link && ln -s .. parent)

Altri nomi di file diversi. Gli ultimi due sono unicode per "barra frazionaria" e "barra di divisione".

touch -- '(' '!' '!!'  $'\xe2\x81\x84' $'\xe2\x88\x95'

Idee di Scott :

touch -- '-' '--' ';' '&' '|' '<' '>' '$' ')' '{' '}' = \\ '!' '#' '{a,b}'

Personaggi innocui in alcuni luoghi ma pericolosi in altri:

touch $'X\xa0Y' # non-breaking space in iso8859-1 which is considered
                # "blank" and "space" in some locales

touch $'\xa3\x5c' $'\xa3\x60' # α and ε in BIG5 or BIG5-HKSCS charset, but
                              # �\ and �` in ASCII

Personaggi che ordinano lo stesso in alcune versioni locali:

touch   # sorts the same in GNU locales, order non-deterministic.

File che sfuggono al mondo .[!.]* *(a volte utilizzati per espandere sia i file nascosti che quelli non nascosti):

touch ..foo ...

l'ironia di un commento "commento" è fonte di distrazione; stai dicendo di aggiungere spiegazioni su cosa stanno facendo i vari comandi?
Jeff Schaller

1
sì, descrivi i casi di test che stai creando di più sono ovvi, alcuni come quello che assomiglia a un carattere Unicode, non lo sono.
Muru,

1
Aggiungerei a?be a*b(citato ovviamente). @muru: le sequenze di byte E2 80 82/83 sono la codifica UTF-8 di U + 2002 EN SPACE e U + 2003 EM SPACE
dave_thompson_085

Alcuni geni malvagi al lavoro lì: -c
user207673,

Potrebbe essere interessante giocare -e --, sebbene, a seconda delle esigenze dello script, potrebbe essere impossibile accedervi senza un lead ./. E mi sorprende che ci siano così pochi con non-glob caratteri shell speciali, come ;, &, |, <, >, $, (, ), {, }, =, \, !, e #- per esempio, {a,b}.
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.