Jak mogę przetestować niezawodność obsługi plików przez mój skrypt powłoki?

11

Napisałem skrypt powłoki, który obsługuje niektóre „zwykłe” nazwy plików, ale przeczytałem Dlaczego mój skrypt powłoki dusi się na białych znakach lub innych znakach specjalnych? i dlaczego nie powinieneś analizować danych wyjściowych ls i chciałbym, aby był bardziej niezawodny i obsługiwał dowolne prawidłowe nazwy plików (i / lub nazwy katalogów). Jak mogę utworzyć stanowisko testowe dla plików i katalogów do uruchamiania mojego skryptu?

Jeff Schaller
źródło

Odpowiedzi:

11

Utwórz oddzielny katalog do gry (głównie w celu ułatwienia późniejszego czyszczenia); wykorzystuje to wartość $TMPDIRif, jeśli jest ustawiona, w przeciwnym razie /tmp:

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

Twórz pliki, które są oddzielne, ale wyglądają podobnie ze względu na białe znaki (spacja, tabulator, znak nowej linii, znak powrotu karetki, 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

Uznanie za powyższe dla Patricka . Te dwa kody szesnastkowe to separatory spacji UTF-8 znane jako nakrętka i baranina ; „w kontekście dwukierunkowym działa jak Biała Przestrzeń i (nie) jest dublowana. Glif (y) można w pewnych okolicznościach mylić z 20 innymi glifami”.

Utwórz zwykły plik i taki, który rozwinąłby się do pierwszego, gdyby był traktowany jako glob:

touch -- x '[x]' 

Uznanie za powyższe Wumpus Q. Wumbley .

W podobnej żyle:

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

Podziękowania za powyższe dla dave_thompson_085 w komentarzach tutaj.

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

Uznanie za powyższe godlygeek .

Nazwa pliku, która rozwinie się do czegoś innego (i potencjalnie dowolnego wykonania!), Jeśli zostanie oceniona w kontekście powłoki:

touch '$( echo boom )'

Posługiwać się:

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

przechwytywać próby umieszczenia nazwy pliku w cudzysłowach bez cytowania znaków.

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

Uznanie za powyższe dla Stéphane Chazelas .

Utwórz nazwaną potok i dowiązanie symboliczne (aby utworzyć pliki, które nie są „zwykłe”):

mkfifo fifo
ln -s a alink

Twórz podkatalogi, które zawierają różne białe znaki w swoich nazwach, wraz z plikami tokena w nich:

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

Twórz nazwy plików zawierające tylko *(prawdopodobnie problematyczne do usunięcia), nazwę pliku składającą się tylko z (zwykłej!) Spacji, martwego dowiązania symbolicznego, dowiązania symbolicznego, które zapętla się, oraz podkatalog z linkiem z powrotem do katalogu nadrzędnego:

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

ln -s /does/not/exist dead

ln -s loop loop

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

Więcej różnych nazw plików. Dwa ostatnie to Unicode dla „ułamkowego ułamka” i „ułamkowego podziału”.

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

Pomysły Scott :

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

Znaki, które są nieszkodliwe w niektórych lokalizacjach, ale niebezpieczne w innych:

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

Znaki, które sortują to samo w niektórych lokalizacjach:

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

Pliki, które uciekają przed .[!.]* *globem (czasami używane do rozwijania zarówno plików ukrytych, jak i nie ukrytych):

touch ..foo ...
Jeff Schaller
źródło
ironia komentarza „komentarz” rozprasza uwagę; czy chcesz dodać wyjaśnienia dotyczące działania różnych poleceń?
Jeff Schaller
1
tak, proszę opisać przypadki testowe, które tworzysz najbardziej, są oczywiste, niektóre takie jak ten, który wygląda jak znak Unicode, nie są.
muru
1
Dodałbym a?bi a*b(oczywiście cytowany). @muru: sekwencje bajtów E2 80 82/83 są kodowaniem UTF-8 dla SP + EN SPACE i U + 2003 EM SPACE
dave_thompson_085
Pracują tam źli geniusze: -c
user207673
Gra może być interesująca -i --chociaż w zależności od wymagań skryptu dostęp do nich bez prowadzenia może być niemożliwy ./. I jestem zaskoczony, że tak mało z non-glob powłoki znaków specjalnych, takich jak ;, &, |, <, >, $, (, ), {, }, =, \, !, i #- na przykład {a,b}.
Scott