Як я можу перевірити надійність обробки файлів сценарію оболонки?


11

Я написав сценарій оболонки, який обробляє деякі "звичайні" назви файлів, але я прочитав, чому мій скрипт оболонки задихається у пробілі чи інших спеціальних символах? і чому ви не повинні розбирати вихід ls, і я хотів би, щоб він був більш надійним і обробляв будь-які дійсні імена файлів (та / або імена каталогів). Як я можу створити пробну версію файлів і каталогів для запуску сценарію?

Відповіді:


11

Створіть окремий каталог, в який слід грати (головним чином для зручності прибирання); для цього використовується значення, $TMPDIRякщо воно встановлено, інакше /tmp:

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

Створіть окремі файли, але схожі між собою через пробіл (пробіл, вкладка, новий рядок, повернення каретки, повернення назад):

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

Подяка за вищезазначене Патріку . Два шістнадцяткові кодові - це розділювачі простору UTF-8, відомі як гайка та бараняча ; "у двонаправленому контексті він виступає як Білий простір і не є дзеркальним відображенням. Гліф (и) можуть за певних обставин переплутати з 20 іншими гліфами."

Створіть звичайний файл і файл, який розшириться до першого, якби він трактувався як глобус:

touch -- x '[x]' 

Заслуговуємо на вищезгадане Wumpus Q. Wumbley .

У подібному ключі:

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

Подяка за вищезазначене dave_thompson_085 у коментарях тут.

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

Подяка за вищезазначене godlygeek .

Ім'я файлу, яке розшириться на щось інше (і, можливо, довільне виконання!), Якщо його оцінюватимуть у контексті оболонки:

touch '$( echo boom )'

Використання:

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

ловити спроби поставити ім'я файлу в лапки без уникнення лапок.

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

Подяка за вищезазначене Стефану Шазеласу .

Створіть названу трубу та символьну посилання (для створення файлів, які не є "регулярними"):

mkfifo fifo
ln -s a alink

Створіть підкаталоги, які містять у їхніх назвах різні пробіли, а також файли лексем усередині них:

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

Створіть лише імена файлів, що містять *(можливо, проблематичне видалення), ім'я файлу, що складається лише з (звичайного!) Простору, мертвого символічного посилання, символічного посилання, яке циркулює на собі, і підкаталога з посиланням на батьківський каталог:

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

ln -s /does/not/exist dead

ln -s loop loop

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

Більше різних імен файлів. Останні два є unicode для "дробової косою рискою" та "косою косою".

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

Ідеї ​​від Скотта :

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

Персонажі, нешкідливі в деяких місцевостях, але небезпечні в інших:

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

Символи, які сортуються однаково в деяких регіонах:

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

Файли, які виходять із .[!.]* *глобуса (іноді використовуються для розширення як прихованих, так і не прихованих файлів):

touch ..foo ...

іронія коментаря "коментар" відволікає; Ви хочете додати пояснення того, що роблять різні команди?
Джефф Шаллер

1
так, опишіть, будь ласка, тестові випадки, які найбільше створюються, очевидні, такі, як той, який схожий на символ Unicode, - це не так.
муру

1
Додам a?bі a*b(цитую звичайно). @muru: байтові послідовності E2 ​​80 82/83 - це кодування UTF-8 U + 2002 EN SPACE та U + 2003 EM SPACE
dave_thompson_085

Там працюють деякі злі генії: -c
user207673

Це може бути цікаво грати з -і --, хоча, в залежності від вимог скрипта, він повинен , можливо , буде неможливо отримати доступ до них без ведучого ./. І я здивований , що так мало з не-Глоб оболонки спеціальні символи, як ;, &, |, <, >, $, (, ), {, }, =, \, !, і #- наприклад, {a,b}.
Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.